如果我在兼容的浏览器(例如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 (没有其他libs)解决方案来按我想要的方式格式化时间戳?
答案 0 :(得分:1)
你应该绕过所有javascript日期格式化函数到最后一刻。
在您的情况下,格式1/01/2015 23:50
与es-ES或en-GB文化日期格式匹配,因此您可以使用函数toLocaleString在一次调用中获得所需的格式;)。
问题是如果你直接用new Date()
转换你的日期,它将被解释为ISO-8601格式,这将使事情变得更加困难,所以你应该用一个字符串进行实例化,以作为一个本地日期。< / p>
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中测试过)
ECMAScript规范指出:如果String不符合标准格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的解析算法。