从本地时区的字符串YYYY-MM-DD创建javascript日期对象

问题描述 投票:0回答:2

我构建了一个使用纯 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
即可?

javascript date datetime
2个回答
1
投票

“这是为什么?”

来自文档:“对 ISO 8601 格式的支持不同,仅日期字符串(例如“1970-01-01”)被视为 UTC,而不是本地。

不建议从字符串中解析日期;建议通过拆分字符串并使用各个组件作为参数来手动完成此操作。或者使用日期库。


0
投票

在 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
© www.soinside.com 2019 - 2024. All rights reserved.