【问题标题】:Date conversion issue in JSJS中的日期转换问题
【发布时间】:2020-01-14 14:13:54
【问题描述】:

我有一个本地时区的日期,即 2020 年 1 月 13 日星期一 00:00:00 GMT+0530(印度标准时间)。 我需要这个

2020 年 1 月 13 日

UTC 日期。当我使用

进行转换时
moment(
    moment(start_date).format('mm-dd-yyyy'),
  ).Unix();

我收到一个 UNIX 时间戳,对应于 2020 年 1 月 12 日的 UTC 日期。 我需要的是 2020 年 1 月 13 日获取日期为 2020 年 1 月 13 日的 UTC 时间戳,而不是获取 2020 年 1 月 12 日。时间值并不重要。

【问题讨论】:

  • Unix 时间戳始终采用 UTC 时间,因此当您从午夜的任何日期转换时,您会得到上一个日期。只要您所在的时区与 UTC 有正偏移。
  • 如果你有一个字符串“Mon Jan 13 2020 00:00:00 GMT+0530 (India Standard Time)”并且只想得到“Jan 13 2020”,那么拆分字符串并格式化它随心所欲(例如dateString.substr(4, 11))。如果没有必要,不要乱用 Date 对象和库。

标签: javascript date unix momentjs utc


【解决方案1】:

像这样获取 UTC 时间戳:

moment.utc('Jan 13 2020').format('X')

以上将为您提供以秒为单位的 UTC 时间戳。

如果您需要毫秒,请使用 x 而不是 X

【讨论】:

    【解决方案2】:

    分解你的陈述:

    moment(start_date)
    

    不向 moment.js 提供解析格式,因此您将收到有关该效果的警告。在这种情况下,moment.js 将回退到内置解析器,就像您编写的一样:

    moment(Date.parse(start_date))
    

    所以您希望内置解析器能够正确解析它。

    然后有:

    .format('mm-dd-yyyy')
    

    如果解析器无法解析字符串,它将返回该格式的日期字符串或无效日期。

    但是,您可能使用了错误的标记,因此结果将类似于“30-mo-yyyy”:

    • mm 是两位数的分钟,如果你想要两位数的月份,请使用 MM
    • dd 是两个字母的日期名称,如果您想要月份中的两位数字日期,请使用 DD
    • yyyy 不是有效令牌,如果您想要四位数年份,请使用 YYYY

    所以格式标记应该是:

    .format('MM-DD-YYYY')
    

    然后将结果传递给 moment,再次不指定输入格式,因此 moment 将再次显示警告并再次使用内置解析器,同样可能出现错误或无效日期。如果解析正确,它将返回 Date 的本地时区的 Date。

    .Unix()
    

    不是有效的时刻方法,您可能需要.unix(),它会为等效的 UTC 时间生成一个 UNIX 时间戳(时间值)。如果主机系统设置为 +5:30,则 UTC 时间将提前 5:30(如果在当地时间上午 5:30 之前,则日期将是前一天)。

    如果您想正确解析字符串并获取一天的开始日期,请执行以下操作:

    moment(start_date, 'ddd MMM DD YYYY HH:mm:ss ZZ').startOf('day').unix()
    

    或者创建一个你喜欢的格式化字符串。更常见的格式是 YYYY-MM-DD,因此请考虑:

    let start_date = 'Mon Jan 13 2020 00:00:00 GMT+0530 (India Standard Time)';
    
    // Get UNIX timestamp for start of day
    console.log(
      moment(start_date, 'ddd MMM DD YYYY HH:mm:ss ZZ').startOf('day').unix()
    );
    
    // Get formatted date string
    console.log(
      moment(start_date, 'ddd MMM DD YYYY HH:mm:ss ZZ').format('YYYY-MM-DD')
    );
    console.log(
      moment(start_date, 'ddd MMM DD YYYY HH:mm:ss ZZ').format('DD MMM YYYY')
    );
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 2013-02-23
      • 2021-02-16
      • 2016-10-22
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多