aru*_*hpj 20 javascript datetime location locale date-fns
const dt = new Date('2017-12-12');
console.log(format(dt, 'YYYY-MM-DD'));
Run Code Online (Sandbox Code Playgroud)
上述代码在美国记录 2017-12-11,但在印度记录 2017-12-12。
我在这里关注了这个 github 线程并尝试了一些东西,但没有得到想要的结果。
我的期望是无论时区如何打印相同的日期
为什么我需要这个:考虑一个涉及生日的场景。如果我提供一些输入日期,则无论其时区如何,它都必须在所有地区显示为相同的日期。
Fer*_*ntl 27
在将其Date传递给formatfrom之前,您需要从实例中减去本地时区的时区偏移量date-fns。例如:
const dt = new Date('2017-12-12');
const dtDateOnly = new Date(dt.valueOf() + dt.getTimezoneOffset() * 60 * 1000);
console.log(format(dtDateOnly, 'YYYY-MM-DD')); // Always "2017-12-12"
Run Code Online (Sandbox Code Playgroud)
您只想处理Date实例的日期部分,因为时间部分对生日没有意义。但是,该Date对象不提供任何“仅日期”模式。您可以在本地时区或 UTC 中访问其日期和时间部分。问题是,formatfromdate-fns总是在本地时区打印输出。
当您仅使用日期部分执行构造函数时:
const dt = new Date('2017-12-12');
Run Code Online (Sandbox Code Playgroud)
JavaScript 引擎实际上假设了一个不完整的 ISO 8601 格式的字符串并执行了以下操作:
const dt = new Date('2017-12-12T00:00:00.000Z');
Run Code Online (Sandbox Code Playgroud)
它对您来说可能仍然看起来“无害”,但该date实例不仅在 UTC 中公开了该值,还在本地时区中公开了该值。如果您Date在美国东海岸构建实例,您将看到以下输出:
> const dt = new Date('2017-12-12');
> dt.toISOString()
'2017-12-12T00:00:00.000Z'
> dt.toString()
'Tue Dec 11 2017 19:00:00 GMT-0500 (EST)'
> d.toLocaleString()
'12/11/2017 7:00:00 PM'
Run Code Online (Sandbox Code Playgroud)
如果您知道,format从本地时区date-fns的date实例中读取日期和时间部分,您将需要使您的日期“看起来像”本地时区的午夜,而不是传递给Date构造函数的UTC 。然后您将看到保留的年、月和日期数字。这意味着,您需要减去指定日期本地时区的时区偏移量。Date.prototype.getTimezoneOffset返回偏移量,但带有倒号和以分钟为单位。
const dt = new Date('2017-12-12');
// Tue Dec 11 2017 19:00:00 GMT-0500 (EST)
const dtDateOnly = new Date(dt.valueOf() + dt.getTimezoneOffset() * 60 * 1000);
// Tue Dec 12 2017 00:00:00 GMT-0500 (EST)
console.log(format(dtDateOnly, 'YYYY-MM-DD'));
// Prints always "2017-12-12", regardless the time zone it executed in
Run Code Online (Sandbox Code Playgroud)
但是,此类Date实例只能用于格式化仅日期值。您不能使用它来计算日期差异,例如,这需要原始和正确的 UTC 值。
如果您始终需要相同的仅日期格式而不是特定于当前语言环境的格式,则不需要date-fns. 您可以通过连接填充数字来格式化字符串:
const dt = new Date('2017-12-12');
const year = dt.getUTCFullYear()
const month = dt.getUTCMonth() + 1 // Date provides month index; not month number
const day = dt.getUTCDate()
// Print always "2017-12-12", regardless the time zone it executed in
console.log(year + '-' + padToTwo(month) + '-', padToTwo(day));
// Or use a template literal
console.log(`${year}-${padToTwo(month)}-${padToTwo(day)}`);
function padToTwo (number) {
return number > 9 ? number : '0' + number
}
Run Code Online (Sandbox Code Playgroud)
仅添加@ferdinand-prantl 答案。如果您使用的是,则可以使用(此处) fn fromdate-fns解析字符串日期 ('2017-12-12') ,这将使用您的本地时区补全缺失的 ISO 8601 格式。当您使用fn 时,您将保留日期。parseISOdate-fnsformat
const strDate = '2017-12-12';
const isoDate = parseISO(strDate);
const formattedDate = format(isoDate, 'YYYY-MM-DD');
console.log({strDate, isoDate, formattedDate})
//{
// strDate: '2017-12-12',
// isoDate: 2017-12-12T02:00:00.000Z,
// formattedDate: '2017-12-12'
//}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18030 次 |
| 最近记录: |