如果我在兼容的浏览器(例如Chrome)中使用<input type="datetime-local" />,则从此输入中获取的值是没有时区的ISO时间戳,例如2015-01-31T23:50
然后,我想根据用户的区域设置格式化此时间戳。例如,当我在法国(UTC + 1)时,我想获取:31/01/2015 23:50
当我使用以下代码时,时间戳解释为UTC,并且我得到了以下日期:1/2/2015 00:50 UTC+1

new Date(timestamp).toLocaleDateString(navigator.language, {
  year: "numeric", month: "numeric", day: "numeric",
  hour: "numeric", minute: "numeric",
  timeZoneName: "short"
})

我可以使用new Date().getTimezoneOffset()读取时区偏移量,将其转换为字符串ISO时区,然后将其附加到时间戳记上,但对我来说似乎很复杂。

什么是更简单的纯js或jquery (无其他库)解决方案来按我想要的方式格式化时间戳?

最佳答案

您应该绕过所有JavaScript日期格式化功能,直到最后一刻。

在您的情况下,格式1/01/2015 23:50与es-ES或en-GB文化日期格式匹配,因此您可以使用toLocaleString函数在一次调用中获得所需的格式;)。

问题是,如果您直接使用new Date()转换日期,它将被解释为ISO-8601格式,这会使事情变得有些困难,因此您应实例化一个字符串,以将其视为本地日期。

    var withOffset = new Date(timestamp).toLocaleString('en-GB');
    console.log(withOffset);

    var withoutOffset= new Date(timestamp.replace('T', ' ')).toLocaleString('en-GB');
    console.log(withoutOffset);

第二个版本将2015-01-31T23:50转换为2015-01-31 23:50,并将其解释为Sat Jan 31 2015 23:50:00 GMT+0100,然后toLocaleString将其转换为所需的格式。

请注意,由于您未使用标准格式将字符串转换为日期,因此这可能无法在所有浏览器中始终有效(我仅在Chrome中对其进行了测试)

07-24 09:46
查看更多