在不同的时区和时刻抓取日期的部分内容



这可能是一个奇怪的问题,但我有一个即时日期,稍后我需要获取其中的部分内容以供不同用途。例如,我从moment中选择一天并显示正在执行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,但我希望在纽约时区得到它,也就是21,如果我想得到日期,也应该是前一天。

我想解决这个问题的方法是使用new Date将其转换为日期对象,并手动设置每个对象,也许吧?类似这样的东西:

const dateWithTimezoneObject = new Date(properDate.year(), properDate.month(), properDate.date(), properDate.hours(), properDate.minutes())

但这听起来有点混乱,我想知道是否有更好的方法来完成这件事,可能是通过这个时刻。

那么,有没有一种方法可以让我在正确的时区时间内得到时刻物体的各个部分?

我相信您正在寻找的是:

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函数有两种不同的风格。CCD_ 14用于构造输入值在该时区内的时刻。CCD_ 15用于将时刻转换到不同的时区。

  • 虽然我在上面的例子中只使用了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对象。

<!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/

最新更新