我正在努力处理Javascript环境中的日期和时间。我们使用两个输入字段来获取事件的日期和时间。事件需要显示并计算其所在时区内的所有日期。例如,如果事件发生在澳大利亚的墨尔本,那么我看到的是墨尔本的当地时间。
我们使用flatpickr进行日期输入和时间输入(两个单独的字段)。
日期返回:2022-11-18T00:00:00.000Z
(即我们只关心日期部分)。时间永远是00:00:00。这在Mongo中存储为"date" : ISODate("2022-11-18T00:00:00.000+0000")
)
时间返回:09:00 AM
我想将其存储到我们的MongoDB作为2022-11-18T09:00:00.000
。
因此,无论何时读取或在计算中使用它,它总是使用事件的本地时间。
我试过moment和date-fns:但是我找不到服务器和浏览器之间的一致性。我在SO上尝试过的所有东西总是转换为UTC。
感谢您的帮助。
日期和时间功能可能会令人困惑,因此最好尽可能保持简单。一般建议将所有内容保持在UTC并转换为本地显示。
一个问题是如何首先获得UTC。
如果用户将其设备设置为适当的区域设置,则从日期和时间输入构造一个Date(可能需要手动解析,不要使用内置解析器)。然后使用toISOString生成时间戳,这将是UTC的等效。
要获得正确的偏移量信息,可以使用:new Intl.DateTimeFormat().resolvedOptions().timeZone
,它将返回系统设置的IANA代表位置,希望与当地事件的日期和时间一致。如果不是(例如,用户可以为不同的时区创建一个事件),你将需要库支持来生成一个合适的UTC时间戳(参见仅为一个特定的时区计算时区偏移量)。
将UTC时间戳(或日期对象)与事件时区一起存储在数据库中。这样,您就可以为事件的位置生成日期和时间,也可以根据用户的系统设置或您喜欢的任何时区生成等效的日期和时间。
。
// Create a Date for New Year's Eve party starting
// at 8:00pm based on the user's current system settings
let event = new Date(2022,11,31, 20);
// Generate UTC timestamp
let ts = event.toISOString();
// Get the (assumed) event offset data
let tz = new Intl.DateTimeFormat().resolvedOptions().timeZone;
// Data to store:
console.log(
`Storen` +
`UTC timestamp: ${ts}n` +
`IANA timezone: ${tz}`
);
console.log(
`Event local date and timen` +
new Date(ts).toLocaleString('en-ca', {
timeZone: tz,
timeZoneName: 'long'
})
);
// Equivalent for user in Somalia
console.log(
`Mogadishu equivalentn` +
new Date(ts).toLocaleString('en-ca', {
timeZone:'Africa/Mogadishu',
timeZoneName: 'long'
})
);
上面的例子说明,一旦你有了UTC时间戳和IANA时区,你就可以为任何时区生成时间戳,包括事件本身的时间戳。
在MongoDB/JavaScript中Date
对象是UTC时间-始终且仅
!如果需要保留来自用户的输入时区,则必须将其存储在单独的字段中。然后你的应用程序可以根据输入的数据显示时区的时间。
几乎在任何日期到字符串"函数,您可以提供所需输出的时区信息。