Joe*_*Joe 1 javascript datetime date
我将日期信息作为数字以毫秒为单位.我能够正确地解析它.但是当我改变我的电脑时区时,解析的时间也会改变.我只想要一个特定的时区.
EX.
Time in millisec: 1461645900000
Actual Parsed: 26-Apr-2016 10:15:00 IST
Run Code Online (Sandbox Code Playgroud)
当pc时区改变时,它变为: Tue Apr 26 2016 14:15:00 GMT+0930 (Local Standard Time)
在这里,我只想要实际时间.怎么弄?
这是我的小尝试:
function parseDateTime(dt, format) {
var months = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec" ];
var ret = "";
if (dt) {
var day="",month="",year="",hour="",mins="",secs="";
var d = new Date(dt)
var os=d.getTimezoneOffset();
if(os<0){
}
ret += d.getDate() + "-" + months[parseInt(d.getMonth())] + "-"
+ d.getFullYear() + " " + leftPad(d.getHours(), 2, "0") + ":"
+ leftPad(d.getMinutes(), 2, "0") + ":"
+ leftPad(d.getSeconds(), 2, "0");
}
document.getElementById("d1").innerHTML=ret;
console.log(ret);
}
function leftPad(number, targetLength, withWhat) {
var output = number + '';
while (output.length < targetLength) {
output = withWhat + output;
}
return output;
}
parseDateTime(1461645900000);
Run Code Online (Sandbox Code Playgroud)
我使用了新的Date().toLocaleString("en-US",{timeZone:""})但有限.我对新的lib也不感兴趣.
小智 8
你对时间和时间表示之间的差异感到困惑.只有一次1461645900000.宇宙中的每个地方都是一样的.这是一个神奇的时刻,恒星以某种方式排列,宇宙处于其进展的特殊点.
时区是表示日期的功能.如果我住在东京,我可能更喜欢在东京时间看我的时间.如果我住在加利福尼亚州,我可能更喜欢在加州时间看我的时间.此类本地时间表示由本地时间和与UTC的偏移量组成,因此可以正确解释.
当您在JS中打印或输出日期时,它会变成一个字符串,当然,作为表示的字符串必须相对于地球上的某个地方 - 换句话说,相对于某些地方而言偏移.默认的JS行为是使用您当前所在的偏移量,如本地计算机上设置的那样.这就是为什么你会看到像"Tue Apr 26 2016 10:15:00 GMT + 0530(印度标准时间)"这样的东西,如果你的电脑设置为印度时间.你也可以尝试date.toISOString哪个会给你"2016-04-26T04:45:00.000Z"("Z"表示UTC),或者date.toUTCString,它会忽略你的本地时区并给出相对于UTC的时间,如"Tue, 2016年4月26日04:45:00 GMT".
仅仅为了完整性,人们通常会混淆偏移和时区.时区是特定区域随时间变化的所有偏移(可以改变,例如在DST的情况下)的完整历史记录.实际上有数百个不同的时区,其中一个是印第安纳州的一个城镇,它在1929年脱离了DST.如果你想管理时区数据,你将不得不分开处理时间本身.即使你碰巧有一个偏移,也没有办法从偏移到时区唯一 - 例如,加利福尼亚和智利是不同的时区,但它们都偏离-08:00.要正确管理时区,您将不得不使用某种特殊的时区包.
我经常听到人们说他们"想要改变时区".你无法改变时间的时区.时代本身没有时区,它们只是宇宙时钟的时代.您可以做的是更改时间的表示,以便相对于特定的偏移量.例如,您可以date.toLocaleString按照您的尝试使用.你觉得它有什么"限制"呢?
> new Date().toLocaleString("en-US", {timeZone: "America/Los_Angeles", timeZoneName: "long"})
< "11/3/2016, 8:33:02 AM Pacific Daylight Time"
Run Code Online (Sandbox Code Playgroud)
您也可以使用timeZoneName: "short",这将产生"PDT".但是,"PDT"或"PST"或"IST"或其他任何内容都不能用作timeZone选项的值,因为这些三字母缩写不是唯一的.例如,"PST"也可能意味着"皮特凯恩标准时间".
您尝试的格式(timeZone作为空字符串)将不起作用(产生未识别的时区错误).
如果你想给一个字符串如"IST"怎么办?如上所述,这不起作用; 你必须找到一种方法将"IST"映射到"亚洲/加尔各答",这将需要某种类型的库.如果要指定某种偏移量怎么办?在这里,您将需要某种类型的库,它可以从偏移量推断出时区.
最重要的是,如果您发现自己正在解析日期,调整此组件或该组件,并使用字符串算法将其拼凑回来,则表明您正在做一些错误或不必要的事情.
我知道您希望在超过毫秒时获得相同的时间,而不管时区如何。
而不是以下两行
var d = new Date(dt)
var os = d.getTimezoneOffset();
Run Code Online (Sandbox Code Playgroud)
你包括以下几行
var os = new Date()
os = os.getTimezoneOffset();
var d = new Date((dt + (os * 60 * 1000)));
Run Code Online (Sandbox Code Playgroud)
这会根据您的本地时区将您的毫秒调整为 UTC 时间,并根据调整后的 UTC 时间创建日期对象,以便您始终获得相同的时间,而不管您的本地时区如何。