【问题标题】:Sorting by a date in unusual format按不寻常格式的日期排序
【发布时间】:2018-04-12 11:51:47
【问题描述】:

我必须按日期属性对表格进行排序,但我的日期如下所示:“14.01.1970 07:55”。如何以与服务器端不同的格式显示此日期?我怎样才能对这种类型的日期进行排序?

【问题讨论】:

  • 你使用 Moment.js 吗?
  • 您可以先将其转换为时间戳,然后使用npm模块dateformat将日期转换为任意格式
  • 我会试试 Moment.js。但我有一个问题。如果我尝试格式化日期,则由于输入格式,存在一些无效日期。我的意思是它从格式 MMDDYYYY 转换日期,其中 MONTH 是第一个,在我的示例中,我首先有 DAY,所以我需要 DDMMYYYY 格式。

标签: javascript reactjs sorting date


【解决方案1】:

只需包含 moment.js 即可轻松格式化:https://momentjs.com/

例如,包装您的时间戳moment(yourtimestamp, 'DD.MM.YYYY HH:mm') 并格式化您喜欢的任何内容,只需.format(yourformat)

像这样:

moment('14.01.1970 07:55', 'DD.MM.YYYY HH:mm').format('YYYY MM DD')

您可以通过创建一个unix时间戳数组来对它们进行排序

moment('12.02.1980 08:55', 'DD.MM.YYYY HH:mm').format('X')

const array = [319186500, 319182900];

array.sort()

如果你有 lodash,也许是_.sortBy

【讨论】:

    【解决方案2】:

    您可以标记字符串并实例化一个新的Date 对象。

    var dateStrings = [ "14.01.1970 07:55", "14.01.1972 07:55", "14.01.1971 07:55" ]
    
    function parseDate(dateString) {
      var tokens = dateString.split(/[\.: ]/g);  
      var date   = parseInt(tokens[0], 10);
      var month  = parseInt(tokens[1], 10) - 1;
      var year   = parseInt(tokens[2], 10);
      var hour   = parseInt(tokens[3], 10);
      var minute = parseInt(tokens[4], 10);
    
      return new Date(year, month, date, hour, minute);
    }
    
    // Zulu time 7 hours + timezone offset
    console.log(dateStrings.map(parseDate).sort((a, b) => a > b)) 
    .as-console-wrapper { top: 0; max-height: 100% !important; }

    【讨论】:

    • 你可以省去 parseInt 直接传递字符串部分,所以很简单return new Date(tokens[2], tokens[1]-1, tokens[0], ...)。 ;-)
    • 为了完整性。
    【解决方案3】:

    这是我在 Javascript 中的操作方式(未经测试的代码警报):

    // STEP : 1 sample Input
    var input = ["01.01.1970 07:55", "06.06.1970 08:55", "03.03.1970 07:55"];
    
    function convertToDateObj(date_string){
        // 14.01.1970 07:55
        date_string = date_string.split('.');
        // [ 0 => 01, 1 => 14, 2 => 1970 07:55 ]
        temp = date_string[0]; date_string[0] = date_string[1]; date_string[1] = date_string[0];
        // 01/14/1970 07:55
        date_string = date_string.join("/");
        // 1970-01-14T02:25:00.000Z
        return new Date(Date.parse(date_string));
    }
    
    // STEP : 2 convert to date Objects
    var dateObjects = [];
    for(var i=0; i<input.length; i++){
       dateObjects[i] = convertToDateObj(input[i]);
    }
    
    // STEP : 3 sort them
    dateObjects.sort(function(date1, date2){
     if (date1 < date2) {
        return -1;
     } else if (date1 == date2) {
        return 0;
     } else {
        return 1;
     }
    })
    
    // your output:
    console.log(dateObjects)
    

    【讨论】:

    • convertToDateObj 函数在解析一个字符串以生成另一个由内置解析器解析的字符串时有些不合逻辑。获得字符串部分后,将它们直接提供给 Date 构造函数。见Why does Date.parse give incorrect results?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2013-02-20
    • 2021-06-07
    • 2017-06-28
    • 2014-11-25
    相关资源
    最近更新 更多