Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript Date()-获取/偏移多个时区_Javascript_Date - Fatal编程技术网

JavaScript Date()-获取/偏移多个时区

JavaScript Date()-获取/偏移多个时区,javascript,date,Javascript,Date,我不是js的不速之客,但还没有做过大量的约会工作 我需要在GMT的三个时区(偏移量+5:30,+7,+8)中获得“现在”,我不知道var now=new Date()将是世界上任何地方的本地“现在”,或者我需要为每个时区计算一个单独的“现在”,以便根据GMT或UTC进行评估 然后,我需要将“现在”var与这三个时区的日期(2019年11月19日上午10:00)进行比较。比如说, let now = new Date(); let presale530 = new Date('11-19-2019

我不是js的不速之客,但还没有做过大量的约会工作

我需要在GMT的三个时区(偏移量+5:30,+7,+8)中获得“现在”,我不知道
var now=new Date()
将是世界上任何地方的本地“现在”,或者我需要为每个时区计算一个单独的“现在”,以便根据GMT或UTC进行评估

然后,我需要将“现在”var与这三个时区的日期(2019年11月19日上午10:00)进行比较。比如说,

let now = new Date();
let presale530 = new Date('11-19-2019 10:00 AM GMT+5:30'); // Bangalore
if (now > presale530) {
  // start the presale in Bangalore
}
上述情况需要在不同的时区同时发生:

let now = new Date();
let presale7 = new Date('11-19-2019 10:00 AM GMT+7'); // Jakarta
if (now > presale7) {
  // start the presale in Jakarta
}
new Date()
返回浏览器指定时区中的日期和时间。编辑:正如罗布所指出的,这是错误的
new Date()
返回具有实际UTC时间的对象。取决于浏览器/系统的方法是
toString()
或普通get方法。每个浏览器的行为都不同,有些在设置中,有些从系统时区继承

因此,这取决于您的业务逻辑。看起来您针对的是不同的位置,因此您的
now
可以正常工作,前提是用户不会篡改他们的设备/浏览器时区,并允许他们设置到他们所在的任何位置。如果您有一些其他代码通过ip确定它们的位置,然后将相应的代码提供给该区域,而不是依赖于它们的浏览器/系统设置,那么您的
now
将是不够的。改为使用
Date().getTime()
获取绝对历元时间,然后将其格式化为所需的时区

因此,这取决于您是否信任用户,以及您是否有更好的方法来定位用户并提供适当的代码

编辑: 在重新阅读您的问题之后,您似乎正在为3个单独的页面编写3组代码。我假设你有一个后端检测ip和服务3个不同的网站,可能有不同的.us、.ca、.cn等

在这种情况下,您希望每个站点同时开始预售,而不依赖于浏览器/计算机设置。这是您必须澄清的业务逻辑。如果是这种情况,最好使用
getTime()
并在您希望进行比较的时区中对其进行格式化

我不知道var now是否等于new Date();将是世界上任何地方的本地“现在”,或者我需要为每个时区计算一个单独的“现在”,以便根据GMT或UTC进行评估

日期是UTC,因此无论本地偏移量如何,“现在”都是相同的,但必须正确设置系统时钟。系统时区偏移量仅在假定本地值的情况下使用(普通设置方法、无偏移量解析字符串等)

Date.prototype.toString返回一个基于主机系统时区偏移量的字符串,而plain get方法返回本地值

getUTC方法返回UTC值,并且无论主机系统设置如何,所有方法都应相同(注意事项与上述相同)

但是,如果您有一个没有时区偏移量的字符串,如“2019年11月19日10:00am”,则必须手动解析并应用偏移量(编写自己的函数或使用库)

例如,将字符串(如“2019年11月19日10:00 AM”)解析为UTC并应用时区偏移(如+05:30)的函数是:

/*将格式为MMMM DD,YYYY hh:mm a的字符串解析为UTC并应用
**格式为+/-HH:mm的时区偏移
**
**@param{string}s-要分析的字符串
**@param{string}offset-+/-HH:mm默认值“+00:00”
**@returns{Date}
*/
函数myParse(s,偏移量='+00:00'){
让月份=['一月','二月','三月','四月','五月','六月',
‘七月’、‘八月’、‘九月’、‘十月’、‘十一月’、‘十二月’;
设b=s.split(/[,:]+/);
设m=months.indexOf(b[0].toLowerCase().substr(0,3));
设hr=+b[3];
设min=+b[4];
设ap=b[5];
hr=(hr%12)+(ap.toLowerCase()='am'?0:12);
//使用符号获取时区偏移的小时和分钟
设c=offset.split(“:”);
设oSign=c[0]<0?'-':'+';
设oHr=+c[0]
设oMin=c[1]*(oSign='-'?-1:1);
//使用UTC值创建日期,应用偏移量
返回新日期(UTC日期(b[2],m,b[1],hr+oHr,min+oMin));
}
//+00:00-即UTC
console.log(myParse(“2019年11月19日上午10:00”);
// +05:30
console.log(myParse(“2019年11月19日上午10:00”,“05:30”);
// -07:00
console.log(myParse(“2019年11月19日上午12:00,'-07:00'));

//日期的差异是12:30,这是时区偏移的差异
你说得对。是的,它返回带有UTC时间的对象。返回局部值的是常见的get方法。getTime()将返回UTC时间。谢谢你的澄清。这是我在回答你的问题之前拼凑出来的。这行吗。如果我手动更改日期,它在这里工作,但我需要100%确保这些日期将在指定的时间在这些时区启动。这是我在回答您的问题之前拼凑的内容。这行吗。如果我手动更改日期,它可以在这里工作,但我需要100%确保这些日期将在指定的时间在这些时区开始。@KirkRoss如果你有其他问题,请将其放到另一篇文章中<代码>新日期('11-19-2019上午10:00 GMT+5:30')在我测试的第一个浏览器中生成无效日期。