【问题标题】:Protractor: How to sort a list by date/time?量角器:如何按日期/时间对列表进行排序?
【发布时间】:2021-12-21 06:20:11
【问题描述】:

如何按日期/时间对列表进行排序? 在我的应用程序中,当我尝试将字符串转换为日期时,日期/时间格式为“星期一,11 月 1 日 | 晚上 8:30”,得到无效日期为 o/p。 帮我按日期/时间对列表进行排序。

Related to this question

【问题讨论】:

  • 这不是 JavaScript 使用的日期和时间的标准表示(它使用 ISO 8601 格式)。要使用这些日期,您必须先将它们转换为这种格式
  • 另外,我不确定这与量角器有什么关系
  • @DimaParzhitsky,我们可以转换成哪种格式以及如何转换?使用 getTime() 将 NaN 作为 o/p。在量角器中,我验证表是否按最近更新排序,因为该日期/时间格式是从上述格式中提到的客户端应用程序获取的。
  • 由于这是一种未知格式,您必须手动执行此操作,使用字符串解析等
  • 如果您是从应用程序中获取此内容,我会首先搜索在 ISO 8601 中获取此内容的选项,该格式很常见。如果这是由同一公司的兄弟团队开发的内部应用程序,只需要求他们返回格式正确的字符串(同样,ISO 8601)

标签: javascript sorting datetime datetime-format


【解决方案1】:

您可以将字符串解析为按要求排序的值。如果年份不重要,那就更容易了。

将月份转换为数字,将小时转换为 24 小时制,然后填充为两位数,例如“Mon, Nov 1 | 8:30 PM”变为 11012030。

例如

function parseMyDate(s) {
  let z = n => ('0'+n).slice(-2);
  let months = {jan:'01',feb:'02',mar:'03',apr:'04',may:'05',jun:'06',
                jul:'07',aug:'08',sep:'09',oct:'10',nov:'11',dec:'12'};
  let [d, M, D, H, m, ap] = s.toLowerCase().split(/\W+/);
  return `${months[M]}${z(D)}${z(H%12 + (ap == 'am'?0:12))}${z(m)}`;
}  

let d = 'Mon, Nov 1 | 8:30 PM';
console.log(`${d} -> ${parseMyDate(d)}`); // 11012030

let data = ['Mon, Nov 1 | 8:30 PM',
            'Mon, Nov 1 | 12:00 PM',
            'Sun, Oct 30 | 8:30 AM',
            'Mon, Nov 1 | 8:30 AM'];
            
console.log(data.sort((a, b) => parseMyDate(a) - parseMyDate(b)));

【讨论】:

    【解决方案2】:

    日期/时间“周一,11 月 1 日 | 8:30 PM”没有“年”

    enter image description here

    【讨论】:

    • 这就是我从应用程序中获取的方式
    • 查看响应,您将不得不拆分日期和时间,然后使用 momentjs 进行修改。 MomentJS - 语法参考。
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 这应该是评论,不是答案。
    【解决方案3】:

    我已经硬编码并修剪了“|”日期/时间格式的字符。能够排序参考下面的sn-p。 根据以下 cmets,getTime() o/p 可能因浏览器而异

    let unsortedDate = [ "Tue, Nov 2 6:25 PM",
    
                  "Wed, Oct 28 12:30 AM",
    
                  "Mon, Nov 8 3:05 AM",
    
                  "Mon, Nov 1 8:30 PM"];
    
    var sort = [];
    unsortedDate.forEach(date => {
        sort.push([ date, new Date(date).getTime() ]);
    })
    console.log(sort);
    
    sort.sort( (a, b)  => a[1] - b[1] );
    
    let sorted_array = sort.map(arr => arr[0])
    
    console.log(sorted_array)

    【讨论】:

    • @RobG,上述解决方案对数据排序没有帮助吗?如果是这样,请提供最佳解决方案并帮助我理解。
    • 没有。内置解析器解析不支持的格式取决于实现,您不知道会发生什么。对于new Date("fri, dec 31 12:30 AM"),Safari 假定年份为 2000,Chrome 2001,Firefox 返回无效日期,因此 getTime 返回 NaN。你认为这将如何排序?
    • @Robg 是的,我同意这不是正确的解决方案,但该应用程序仍然支持 chrome,我们仅在 chrome 中执行所有脚本。而且,BA 还没有准备好在应用程序中更新日期/时间的格式。即使我从功能上问他们,这也不是很好,但客户仍然喜欢坚持当前的格式,尽管年份对他们来说并不是什么大不了的事。 ?? 没有找到更多的解决方法,因此以这种方式处理。
    • @RobG,除了日期格式,我们如何看待'|'特点 ?如果我们在日期/时间格式上添加年份,则不删除“|”特点。我们无法使用 getTime() 将其转换为日期格式。
    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多