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

IT技术 javascript jquery datetime geolocation timezone
2021-02-09 01:12:29

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

6个回答

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

var now = new Date();

这将使用客户端的本地时间创建一个新的 Date 对象。

@32bitkid:这是可能的。但如果那是他想要的,我会建议不要这样做。如果客户想通过与他实际居住的地点不同的时区来射击自己的腿,他可能有充分的理由。在这种情况下,您作为程序员应该尊重这一点。
2021-03-19 01:12:29
@Truth 在new Date()客户端上执行 a将在操作系统的时区,而不是盒子所在的物理时区。后者是问题所要求的,这就是他询问 IP 地址和地理编码的原因。
2021-03-22 01:12:29
@user850234:请给我们一些背景信息。我看不出您需要实际时区而不是客户报告给您的时区的任何理由。如果他想假装他住在中国,你有什么资格告诉他不要?
2021-03-26 01:12:29
@user850234:你没有回答我的问题。什么是你想怎么办?如何你想做到这一点。你的应用程序有什么作用?为什么你需要知道客户的实际时区而不是他报告的他正在使用的时区。
2021-04-08 01:12:29
我认为他想要一种方法来获得独立于客户的客户时区......
2021-04-13 01:12:29

如今,您只需一行代码即可获得用户的正确时区:

const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;

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

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

const currentTime = moment().tz(timezone).format();
Moment.js 现已弃用
2021-03-28 01:12:29
这是否取决于客户?
2021-04-13 01:12:29

尝试

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

console.log(s);

如果你想知道客户端相对于 GMT/UTC 的时区,你可以去:

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

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

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

更新 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

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

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"
在我看来,是一种更好的方式来获得UTC标准:d.getTimezoneOffset()它以分钟数返回 UTC 的偏移量。
2021-03-23 01:12:29
从来没有用过。好提示。有一件事它没有做,但我给出的第二个例子确实做了,它实际上并没有告诉你时区。响应会根据是否为夏令时而变化(如我的第一个示例)。
2021-03-24 01:12:29
Date.prototype.toString返回的值完全依赖于实现,但这个答案依赖于它在所有主机上的标准化。
2021-03-31 01:12:29
@RobG 完全正确。理论上植入可能会有所不同,但它实践 Edge、Blink、Webkit 和 Gecko(覆盖 99% 的浏览器)在此功能方面的功能都相同。在未来可能会改变,但不太可能。这个问题没有完美的解决方案。
2021-04-03 01:12:29
@pseudosavant——“完美的解决方案”是getTimezoneOffset,它准确地报告系统偏移量的设置。时区缩写没有标准,例如 EST 可能是三个时区之一。OP 没有答案(即独立于系统设置确定时区),它不需要某种方式来确定主机位置以及时间边界和时间更改规则(例如夏令时)的数据库,而不仅仅是询问用户。
2021-04-10 01:12:29

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

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

见下面的例子

 function getLocaltime(){
   return new Date().toLocaleTimeString();
 }
 console.log(getLocaltime());