如何获得客户的确切当地时间?

use*_*234 34 javascript jquery timezone datetime geolocation

无论客户端系统的时区如何,获取客户端本地时间的最佳方法是什么?我正在创建一个应用程序,我首先需要获取客户端访问位置的确切时间和日期.即使检测客户端系统的IP地址也有缺点,或者检测客户端系统的时区有时可能存在风险.那么,有没有什么方法可以真正可靠并且不容易出错,因为向客户显示错误的时间和日期是非常令人尴尬的.

Mad*_*iha 44

在JavaScript?只需实例化一个新的Date对象

var now = new Date();
Run Code Online (Sandbox Code Playgroud)

这将创建一个具有客户端本地时间的新Date对象.

  • @ 32bitkid:这是可能的.但如果这就是他想要的,我会建议不要这样做.如果客户希望通过与他实际居住的地方不同的时区拍摄自己的腿,他可能有充分的理由.在这种情况下,作为程序员,您应该尊重这一点. (4认同)
  • 我想他想要一种方法来让客户的时区独立于客户...... (2认同)
  • @Truth 在客户端上执行 `new Date()` 将位于操作系统的时区,而不是盒子所在的物理时区。 *后者* 是问题所要求的,这就是他的原因询问 IP 地址和地理编码。 (2认同)

Sta*_*nko 19

现在,您可以获得只有一行代码的用户的正确时区:

const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
Run Code Online (Sandbox Code Playgroud)

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions

然后,您可以使用moment-timezone来解析时区,如:

const currentTime = moment().tz(timezone).format();
Run Code Online (Sandbox Code Playgroud)

  • 这是否取决于客户 (2认同)

Kam*_*ski 12

尝试

let s= new Date().toLocaleString();

console.log(s);
Run Code Online (Sandbox Code Playgroud)


pse*_*ant 10

如果您想知道客户相对于GMT/UTC的时区,请转到:

var d = new Date();
var tz = d.toString().split("GMT")[1].split(" (")[0]; // timezone, i.e. -0700
Run Code Online (Sandbox Code Playgroud)

如果您想要时区的实际名称,可以试试这个:

var d = new Date();
var tz = d.toString().split("GMT")[1]; // timezone, i.e. -0700 (Pacific Daylight Time)
Run Code Online (Sandbox Code Playgroud)

更新1

根据您的第一条评论,您还可以使用d.getTimezoneOffset()从UTC获得以分钟为单位的偏移量.但是夫妇的陷阱与它.

  1. 返回的分钟符号(+/-)可能与您期望的相反.如果你是8小时背后 UTC将返回480不能-480.有关更多文档,请参阅MDNMSDN.
  2. 它实际上并没有返回客户端报告的时区,就像我给出的第二个例子一样.只是当前从UTC偏移的分钟数.所以它会根据夏令时变化.

更新2

虽然字符串拆分示例有效,但它们可能会令人困惑.这是一个应该更容易理解的正则表达式版本,并且可能更快(尽管两种方法都非常快).

如果您想知道客户相对于GMT/UTC的时区,请转到:

var gmtRe = /GMT([\-\+]?\d{4})/; // Look for GMT, + or - (optionally), and 4 characters of digits (\d)
var d = new Date().toString();
var tz = gmtRe.exec(d)[1]; // timezone, i.e. -0700
Run Code Online (Sandbox Code Playgroud)

如果您想要时区的实际名称,请尝试以下方法:

var tzRe = /\(([\w\s]+)\)/; // Look for "(", any words (\w) or spaces (\s), and ")"
var d = new Date().toString();
var tz = tzRe.exec(d)[1]; // timezone, i.e. "Pacific Daylight Time"
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,有一个更好的方法来获得UTC的偏移:`d.getTimezoneOffset()`.它以分钟数返回UTC的偏移量. (6认同)

小智 10

为了在纯 Javascript 中获取本地时间,请使用这个内置函数

// return new Date().toLocaleTimeString();

请参阅下面的示例

 function getLocaltime(){
   return new Date().toLocaleTimeString();
 }
 console.log(getLocaltime());
Run Code Online (Sandbox Code Playgroud)


Wae*_*fan 5

  • 直接这样:

    new Date((new Date().setHours(new Date().getHours() - (new Date().getTimezoneOffset() / 60)))).toISOString()
    
    Run Code Online (Sandbox Code Playgroud)
  • 此实用程序函数中有更多详细信息

    function getLocaLTime() {
      // new Date().getTimezoneOffset() : getTimezoneOffset in minutes 
      //for GMT + 1 it is (-60) 
      //for GMT + 2 it is (-120) 
      //..
      let time_zone_offset_in_hours = new Date().getTimezoneOffset() / 60;
      //get current datetime hour
      let current_hour = new Date().getHours();
      //adjust current date hour 
      let local_datetime_in_milliseconds = new Date().setHours(current_hour - time_zone_offset_in_hours);
      //format date in milliseconds to ISO String
      let local_datetime = new Date(local_datetime_in_milliseconds).toISOString();
      return local_datetime;
      }
    
    Run Code Online (Sandbox Code Playgroud)