抓住时刻在不同时区的部分日期

时间:2018-12-11 17:06:27

标签: javascript date datetime momentjs

这可能是一个奇怪的问题,但是我有一个约会,稍后我将需要抓住其中的一部分以用于不同的用途。例如,我抢了一天,从date.date()开始展示moment

所有这些都发现并花哨,但问题是时区与此相关。 所以我有我的矩对象,它是从字符串创建的:

const properDate = moment.tz(date, 'YYYY-MM-DD hh:mm:ss.SSS', 'America/New_York')

根据我的理解,对于我来说,我会这样做

properDate.format()

但是这会将其转换为字符串。我希望能够在正确的时区获取时间和日期。所以基本上,当我做properDate.hours()时,我会在UTC的时间得到它,但我想在America/New_York中得到它。

例如,我要输入的日期字符串为2018-12-31 02:00:00.000 +00:00

当我通过上面的代码运行它,然后执行properDate.hours()时,我将得到2,但我想在纽约时区(即{{1 }},如果要获取日期,也将是前一天。

我想一种解决方法是使用21将其转换为日期对象,然后手动设置每个对象?像这样:

new Date

但这听起来有些混乱,我想知道是否有更好的方法来完成此操作,也许是一时之间。

那么,有没有办法让我在适当的时区时间内获取矩对象的一部分?

2 个答案:

答案 0 :(得分:1)

我相信您正在寻找的是:

var m = moment("2018-12-31 02:00:00.000 +00:00","YYYY-MM-DD HH:mm:ss.SSS Z")
           .tz('America/New_York');

m.hours() //=> 21

几件事:

  • 请注意,提供的输入格式区分大小写,并且需要匹配输入字符串。在您的问题中,您使用的是hh而不是HH,并且也没有提供Z的时区偏移量。

  • tz函数有两种风格。 moment.tz()用于构造一个时刻,其中输入值为该时区。 moment().tz()用于将时刻转换为其他时区。

  • 尽管我在上面的示例中仅使用了moment,但是您可以使用moment.tzmoment.utcmoment.parseZone,效果是相同的,但仅因为您在输入字符串中包含了偏移量+00:00。如果您实际上没有该偏移量,则可以使用moment.utc,如下所示:

    var m = moment.utc("2018-12-31 02:00:00.000","YYYY-MM-DD HH:mm:ss.SSS")
                  .tz('America/New_York');
    
  • 关于您建议的解决方案,这将是创建一个代表不同时间点的Date对象。通常,一旦使用Moment,如果可以改用Moment函数,则应避免使用Date对象。

答案 1 :(得分:0)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
</head>
<body>
  Test
  <script src="moment.js"></script>
  <script src="moment-timezone-with-data.js"></script>
  <script>
    const date = '2018-12-31 02:00:00.000 +00:00' 
    const new_york = moment(date,'YYYY-MM-DD HH:mm:ss.SSS Z')
      .tz('America/New_York')
    document.body.textContent = 
      `day: ${new_york.dates()} hour: ${new_york.hours()}`
  </script>
  </body>
</html>

https://momentjs.com/timezone/