【问题标题】:Timezone issue converting date to "Today", "Yesterday", "2 days ago", etc. in Javascript时区问题在 Javascript 中将日期转换为“今天”、“昨天”、“2 天前”等
【发布时间】:2020-03-18 17:20:38
【问题描述】:

我有一个新闻提要,我想将一篇文章的发布时间简单地显示为今天、昨天、2 天、3 天前等。我只想保留 YYYY-MM-DD 格式并摆脱时区部分。但是,在纽约东部时间 (ET) 晚上 8 点,日期会从 2 天前更改为 3 天前。如何确保仅在美国东部时间每天午夜进行此更改?

文章日期示例: 2020-03-17T04:00:00.000Z

当前代码:

 convertDateLiteral(article_date: string) {
    const newDt = article_date.split('T')[0];
    let date = moment(newDt);
    if (moment({hours: 0}).diff(date, 'days') >= 2) {
            return date.add(1,'d').fromNow(); // '2 days ago' etc.
    }
    //console.log(date.calendar().split(' ')[0])
    return date.calendar().split(' ')[0]
    }

【问题讨论】:

    标签: javascript typescript date calendar momentjs


    【解决方案1】:

    给定 ISO 8601 格式的日期字符串,您可以转换为 Date 对象,将时间归零,然后与今天的日期进行比较,时间归零并四舍五入以进行夏令时更改(如果有)。例如

    function getEvenDaysDiff(d) {
      let now = new Date();
      now.setHours(0,0,0,0);
      let then = new Date(d);
      then.setHours(0,0,0,0);
      return Math.round((now - then) / 8.64e7);
    }
    
    function parseAndFormatDate(d) {
      d = new Date(d);
      let z = n => (n<10?'0':'')+n;
      return d.getFullYear() + '-' +
             z(d.getMonth()+1) + '-' +
             z(d.getDate());  
    }
    
    // test - dates are UTC so local dates may differ
    let dates = [
     '2020-03-17T04:00:00.000Z',
     '2020-03-16T14:00:00.000Z',
     '2020-03-12T04:30:00.000Z',
     '2020-02-17T12:00:00.000Z'
    ].forEach(
      s => console.log(parseAndFormatDate(s) + ' ' + getEvenDaysDiff(s) + ' days ago.')
    );

    请注意,由于时间戳为 UTC,它们表示的日期可能与等效的本地日期不同。我假设您希望与当地日期有所不同。如果你想要 UTC,那么在 getEvenDaysDiff 中使用 UTC 方法,而 parseAndFormatDate 函数是多余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      相关资源
      最近更新 更多