我构建了一个使用纯 javascript Date 对象和 date-fns 来格式化和操作对象的应用程序。
该应用程序在我开发它的格林威治标准时间(GMT)下完美运行,但我现在在美国西海岸,我发现我的许多日期对象由于时区差异而被丢弃。
我正在从字符串创建日期对象,或者只是
YYYY-MM-DD
或 YYYY-MM-DD HH:mm
,例如 new Date('2018-01-19')
或 new Date('2018-01-19 08:00')
。
问题是,当我从格式为
YYYY-MM-DD
的字符串创建日期时,它会创建对象,而忽略本地时区。
const date1 = new Date('2018-01-19');
const date2 = new Date('2018-01-19 00:00');
const dateString1 = format(date1, 'YYYY-MM-DD'); // gives '2018-01-18'
const dateString2 = format(date2, 'YYYY-MM-DD'); // gives '2018-01-19'
根据您是否经过时间,行为并不一致。如果您传递时间,则日期对象将固定为本地时区,但如果您不传递,则它将固定为 UTC。我想要的是,如果我传递一个不带时间(仅年、月和日)的日期字符串,它也会创建一个日期对象,假设它是本地时区一天的开始。
这是为什么呢?每次创建 Date 对象时,我是否只需将时间设置为
00:00
即可?
来自文档:“对 ISO 8601 格式的支持不同,仅日期字符串(例如“1970-01-01”)被视为 UTC,而不是本地。”
不建议从字符串中解析日期;建议通过拆分字符串并使用各个组件作为参数来手动完成此操作。或者使用日期库。
在 JS 中有几种不同的方法来实例化 Date 对象。
当您执行
new Date('2018-03-01)
时,它假定时间为 00:00:00 UTC(格林威治时区)。
但是,如果此实例类似于
new Date(2018, 2, 1)
,则它假定时间为本地时区 00:00:00。
有一点细微的差别,因为月份需要是基于 0 的表示(一月是月份 0)。
所以转换可能是这样的:
const dateString = "2018-03-01"
const [year,month,day] = dateString.split('-')
const date = new Date(year, month - 1, day) //gives day in local timezone