Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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 如何跨时区正确转换时间?_Javascript_Date_Datetime_Timezone_Timezone Offset - Fatal编程技术网

Javascript 如何跨时区正确转换时间?

Javascript 如何跨时区正确转换时间?,javascript,date,datetime,timezone,timezone-offset,Javascript,Date,Datetime,Timezone,Timezone Offset,假设美国CA的用户选择了一个日期、时间和时区: 全球啤酒马拉松赛于2013年8月15日UTC-08:00上午10:00开始 中欧的另一个用户打开显示此日期和时间的页面。他不想计算时间(已经没有几瓶啤酒了)。他只是想看看这个日期和时间: 2013年8月15日19:00 如果浏览器收到加利福尼亚州用户输入的日期和时间信息: 在javascript中,有没有一种方法可以在没有外部web服务的情况下进行正确的转换?也就是说,检测上午10点UTC-08:00实际上应该是上午10点UTC-07:00,因为它

假设美国CA的用户选择了一个日期、时间和时区:

全球啤酒马拉松赛于2013年8月15日UTC-08:00上午10:00开始

中欧的另一个用户打开显示此日期和时间的页面。他不想计算时间(已经没有几瓶啤酒了)。他只是想看看这个日期和时间:

2013年8月15日19:00

如果浏览器收到加利福尼亚州用户输入的日期和时间信息:

在javascript中,有没有一种方法可以在没有外部web服务的情况下进行正确的转换?也就是说,检测上午10点UTC-08:00实际上应该是上午10点UTC-07:00,因为它是夏令时

也许我从一开始就错误地理解了这一点,但我不想让输入的用户思考他应该选择UTC-08:00(PST)还是UTC-07:00(PDT)。我假设,由于CA中的标准时区是PST,人们在夏季不会转而使用PDT进行思考。还是他们

在中欧,标准日期为UTC+01:00,夏令时日期为UTC+02:00。所以CA和欧洲之间的差异应该是9小时,除了一年中的两个时段,当一个或另一个地区在标准和夏令时模式之间切换时

更新:

在仔细思考和阅读评论之后,我最理想的需要是:

var utcOffset = f('2013-08-15T10:00', 'America/Los_Angeles');
// utcOffset == "-07:00"
var utcOffset = f('2013-11-15T10:00', 'America/Los_Angeles');
// utcOffset == "-08:00"
到目前为止,GuidoPreite建议的方法似乎能够做到这一点(或多或少)


任何其他方式,使用浏览器API?

默认构造函数创建本地时间实例

var localDate = new Date(); 
我现在无法测试它,但您应该能够提供您的datetime(作为构造函数的参数)

…然后您应该能够调用日期对象函数,如getMonth,它返回本地时区的数据。载于:

注1:没有服务器=根本没有服务器| db?如果有,则日期应保存为数据库中的UTC,并加载为每个用户的本地时间。。这样你就不用担心转换了

注2:此问题有一些代码显示如何获取时区差:

在javascript中,有没有一种方法可以在没有外部web服务的情况下进行正确的转换?也就是说,检测上午10点UTC-08:00实际上应该是上午10点UTC-07:00,因为它是夏令时

10:00-8和10:00-7在时间上是两个不同的时刻。它们分别等于18:00Z和17:00Z(Z=UTC)。当以偏移量进行测量时,夏令时不会进入图片。永远

我假设,由于CA中的标准时区是PST,人们在夏季不会转而使用PDT进行思考。还是他们

一般来说,人们只是在“太平洋时间”思考,这意味着冬季的PST和夏季的PDT。但是计算机更精确。当您看到PST时,它的意思是UTC-8。当您看到PDT时,它表示UTC-7。使用一种形式的标签同时引用另一种形式的偏移量是无效的

时区缩写。理想情况下,以编程方式引用区域时,应使用IANA区域名称,例如
America/Los_Angeles
。但是,在没有库的所有JavaScript运行时中,这是不可能的。()

在中欧,标准日期为UTC+01:00,夏令时日期为UTC+02:00。所以CA和欧洲之间的差异应该是9小时,除了一年中的两个时段,当一个或另一个地区在标准和夏令时模式之间切换时

对。他们可能相隔8、9或10小时。不过,它们在完全不同的时间切换,所以不要试图自己管理

到目前为止,GuidoPreite建议的moment.js/timezone插件似乎能够做到这一点(或多或少)

这是一个很棒的图书馆。然而,从您描述的场景来看,我认为您不必像您所想的那样担心时区转换。看看是否可以遵循以下逻辑:

  • 加利福尼亚州的用户在文本框中输入日期和时间
  • 将该文本框值读入字符串,并将其解析为日期:

    var dt = new Date("8/15/2013 10:00");
    
    或者使用moment.js:

    var m = moment("8/15/2013 10:00", "M/D/YYYY HH:mm");
    
  • 因为这是在用户的计算机上完成的,JavaScript将自动假定这是本地日期和时间。您不需要提供任何偏移或时区信息

  • 这意味着由于DST转换,输入的时间可能无效或不明确。事实上,JavaScript并不能很好地处理这一问题——在不同的浏览器上会得到不同的结果。如果您希望明确,那么您将提供一个偏移量

    // PST
    var dt = new Date("3/11/2013 1:00 UTC-08:00");
    
    // PDT
    var dt = new Date("3/11/2013 1:00 UTC-07:00");
    
  • 一旦有了
    日期
    (或
    时刻
    ),就可以评估其UTC等效值:

    var s = dt.toISOString();  //  2013-08-15T17:00:00Z
    
    与moment.js相同,但您将获得更好的浏览器支持:

    var s = m.toISOString();  //  2013-08-15T17:00:00Z
    
  • 将该UTC值存储在数据库中

  • 中欧的另一个用户过来加载数据

  • 在JavaScript中将其输入到
    日期
    时刻

    var dt = new Date("2013-08-15T17:00:00Z");
    
    或者使用moment.js(同样,更好的浏览器支持)

  • 因为JavaScript知道本地计算机的时区规则,所以您现在可以显示该日期,并显示中欧时区:

    var s = dt.ToString();  //  browser specific output
    // ex: "Thu Aug 15 2013 19:00:00 GMT+0200 (Central Europe Daylight Time)"
    
    或者使用moment.js,您可以更好地控制输出格式

    var s = m.format("DD/MM/YYYY HH:mm"); // "15/08/2013 19:00"
    
    您还可以让moment.js决定应该输出什么本地化格式:

    var s = m.format("llll"); // "Thu, 15 Aug 2013 19:00"
    
  • 总而言之,如果您只想在本地时区(无论是哪个时区)之间进行转换,那么您只需使用
    日期
    。js将使解析和格式化变得更容易,但它不是绝对必需的

    只有少数场景需要时区库(例如时刻时区或其他)

    • 您想要转换到t区或从t区转换
      var s = m.format("DD/MM/YYYY HH:mm"); // "15/08/2013 19:00"
      
      var s = m.format("llll"); // "Thu, 15 Aug 2013 19:00"
      
      /* 
      * Author: Mohammad M. AlBanna
      * Website: MBanna.me
      * Description: Get the current time in different time zone 
      */
      
      //Check daylight saving time prototype
      Date.prototype.stdTimezoneOffset = function() {
          var jan = new Date(this.getFullYear(), 0, 1);
          var jul = new Date(this.getFullYear(), 6, 1);
          return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
      }
      
      Date.prototype.dst = function() {
          return this.getTimezoneOffset() < this.stdTimezoneOffset();
      }
      
      var today = new Date();
      var isDST = today.dst() ? true : false;
      var pstOffset = isDST ? 7 : 8;
      var cstOffset = isDST ? 5 : 6;
      var estOffset = isDST ? 4 : 5;
      var gmtOffset = 1;
      
      pstOffset = pstOffset * 60 * 60 * 1000;
      cstOffset = cstOffset * 60 * 60 * 1000;
      estOffset = estOffset * 60 * 60 * 1000;
      gmtOffset = gmtOffset * 60 * 60 * 1000;
      
      var todayMillis = today.getTime();
      var timeZoneOffset = (today.getTimezoneOffset() * 60 * 1000);
      
      var curretPST = todayMillis - pstOffset; 
      var curretCST = todayMillis - cstOffset; 
      var curretEST = todayMillis - estOffset;
      var curretGMT = todayMillis - gmtOffset;
      
      addP("PST Time : " + new Date(curretPST).toUTCString());
      addP("CST Time : " + new Date(curretCST).toUTCString());
      addP("EST Time : " + new Date(curretEST).toUTCString());
      addP("GMT Time : " + new Date(curretGMT).toUTCString());
      addP("Local Time : " + new Date(today.getTime() - timeZoneOffset ).toUTCString());
      
      function addP(value){
          var p = document.createElement("p");
          p.innerHTML = value;
          document.body.appendChild(p);
      }