提问人:Merc 提问时间:3/18/2012 最后编辑:TylerHMerc 更新时间:7/11/2022 访问量:491664
如何在 JavaScript 中获取 UTC 时间戳?
How do I get a UTC Timestamp in JavaScript?
问:
在编写 Web 应用程序时,将数据库中的所有日期时间(服务器端)存储为 UTC 时间戳是有意义的。
当我注意到你在 JavaScript 中的时区操作方面本身无法做太多事情时,我感到很惊讶。
我稍微扩展了 Date 对象。这个功能有意义吗?基本上,每次我向服务器发送任何内容时,它都会是用这个函数格式化的时间戳......
你能在这里看到什么重大问题吗?或者也许是从不同角度的解决方案?
Date.prototype.getUTCTime = function(){
return new Date(
this.getUTCFullYear(),
this.getUTCMonth(),
this.getUTCDate(),
this.getUTCHours(),
this.getUTCMinutes(),
this.getUTCSeconds()
).getTime();
}
这对我来说似乎有点令人费解。而且我对性能也不太确定。
答:
以这种方式构造的日期使用本地时区,使构造的日期不正确。设置某个日期对象的时区就是从包含该时区的日期字符串构造它。(我在较旧的 Android 浏览器中无法使用它。
请注意,返回的是毫秒,而不是普通的秒。
getTime()
对于 UTC/Unix 时间戳,以下内容就足够了:
Math.floor((new Date()).getTime() / 1000)
它会将当前时区偏移量计入结果中。对于字符串表示,David Ellis 的答案是有效的。
澄清一下:
new Date(Y, M, D, h, m, s)
该输入被视为本地时间。如果传入 UTC 时间,结果会有所不同。观察(我现在在格林威治标准时间 +02:00,现在是 07:50):
> var d1 = new Date();
> d1.toUTCString();
"Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time
> Math.floor(d1.getTime()/ 1000)
1332049834
> var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() );
> d2.toUTCString();
"Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0!
> Math.floor(d2.getTime()/ 1000)
1332042634
另请注意,不能代替 .这是因为返回当月的某一天;然而,返回星期几。getUTCDate()
getUTCDay()
getUTCDate()
getUTCDay()
评论
new Date()
Math.floor(this.getTime() / 1000)
d1.getUTCHours(), d1.getUTCMinutes()
您也可以使用 getTimezoneOffset 和 getTime 来做到这一点,
x = new Date()
var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000;
console.log("UTCseconds", UTCseconds)
评论
var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000
tt.getTime() - tt.getTimezoneOffset()
GMT+0800
var UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
new Date()
我实际上认为 js 中的 Date 值比 C# DateTime 对象要好得多。C# DateTime 对象具有 Kind 属性,但本身没有严格的基础时区,如果在两个非 UTC 时间和非本地时间之间进行转换,则很难跟踪时区转换。在 js 中,所有 Date 值都有一个基础 UTC 值,无论您进行何种偏离或时区转换,该值都会被传递和已知。我对 Date 对象最大的抱怨是浏览器实现者选择包含的大量未定义行为,这可能会使那些在 js 中攻击日期的人感到困惑,而不是阅读规范。使用类似 iso8601.js 的东西通过定义 Date 对象的单个实现来解决这种不同的行为。
默认情况下,规范说您可以使用扩展的 ISO 8601 日期格式创建日期,例如
var someDate = new Date('2010-12-12T12:00Z');
因此,您可以通过这种方式推断出确切的 UTC 时间。
当您要将 Date 值传递回服务器时,您将调用
someDate.toISOString();
或者,如果您更愿意使用毫秒时间戳(从 1970 年 1 月 1 日 UTC 开始的毫秒数)
someDate.getTime();
ISO 8601 是一项标准。如果包含日期偏移量,则不会对日期字符串的含义感到困惑。对于开发人员来说,这意味着您永远不必自己处理本地时间转换。本地时间值的存在纯粹是为了用户的利益,默认情况下,日期值以本地时间显示。所有本地时间操作都允许您向用户显示一些有意义的内容,并从用户输入转换字符串。尽快转换为 UTC 是一种很好的做法,而 js Date 对象使这变得相当微不足道。
不利的一面是,强制客户端的时区或区域设置的范围不大(我知道),这对于特定于网站的设置来说可能很烦人,但我想这背后的原因是它是一个用户配置不应该被触及。
因此,简而言之,对时区操作的原生支持不多的原因是你根本不想这样做。
编辑:下面的代码不起作用。我一直假设 new Date().getTime() 返回自 1970 年 1 月 1 日以来当前时区的秒数。事实并非如此:getTime() 返回 UTC 中的秒数。因此,下面的代码确实进行了严重的过度调整。谢谢大家!
首先,感谢您的精彩见解。 我想我的问题标题错了......它应该是“获取现有日期的 UTC Unix 时间戳”。
所以,如果我有一个日期对象:
var d = new Date(2009,01,31)
我正在寻找一个会告诉我“UTC Unix 时间戳”的函数。
这个功能似乎是真正的诀窍:
Date.prototype.getUTCUnixTime = function (){
return Math.floor( new Date(
this.getUTCFullYear(),
this.getUTCMonth(),
this.getUTCDate(),
this.getUTCHours(),
this.getUTCMinutes(),
this.getUTCSeconds()
).getTime() / 1000);
}
请注意,它适用于“this”这意味着我可以做:
var n = new Date(2008,10,10)
...
...
n.getUTCUnixTime();
并获取自 1970 年 1 月 1 日以来的 Unix 时间秒数。 右?
对我来说,Javascript 以 UTC 时间存储所有内容有点疯狂,但为了获得该数字,我必须创建一个新的 Date 对象来传递各个 UTC getter,然后最后为此调用 getTime()......
默克。
评论
getUTCUnixTime
Date
getTime
我对这个问题变得如此复杂感到惊讶。
它们都是相同的,它们的整数值都是 === EPOCH 时间:D
console.log((new Date()).getTime() / 1000, new Date().valueOf() / 1000, (new Date() - new Date().getTimezoneOffset() * 60 * 1000) / 1000);
不相信我,结帐:http://www.epochconverter.com/
通常不需要在客户端执行太多的“时区操作”。通常,我尝试以“自 1970 年 1 月 1 日午夜以来的毫秒数”的形式存储和处理 UTC 日期。这确实简化了存储、排序、偏移量的计算,最重要的是,让您摆脱了“夏令时”调整的麻烦。这是我使用的一些 JavaScript 代码。ticks
要获取当前 UTC 时间,请执行以下操作:
function getCurrentTimeUTC()
{
//RETURN:
// = number of milliseconds between current UTC time and midnight of January 1, 1970
var tmLoc = new Date();
//The offset is in minutes -- convert it to ms
return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000;
}
然后,您通常需要的是将最终用户的日期/时间格式设置为其本地时区和格式。以下内容负责处理客户端计算机上日期和时间格式的所有复杂性:
function formatDateTimeFromTicks(nTicks)
{
//'nTicks' = number of milliseconds since midnight of January 1, 1970
//RETURN:
// = Formatted date/time
return new Date(nTicks).toLocaleString();
}
function formatDateFromTicks(nTicks)
{
//'nTicks' = number of milliseconds since midnight of January 1, 1970
//RETURN:
// = Formatted date
return new Date(nTicks).toLocaleDateString();
}
function formatTimeFromTicks(nTicks)
{
//'nTicks' = number of milliseconds since midnight of January 1, 1970
//RETURN:
// = Formatted time
return new Date(nTicks).toLocaleTimeString();
}
所以下面的例子:
var ticks = getCurrentTimeUTC(); //Or get it from the server
var __s = "ticks=" + ticks +
", DateTime=" + formatDateTimeFromTicks(ticks) +
", Date=" + formatDateFromTicks(ticks) +
", Time=" + formatTimeFromTicks(ticks);
document.write("<span>" + __s + "</span>");
返回以下内容(适用于我的美国英语区域设置):
ticks=1409103400661,DateTime=8/26/2014 6:36:40 PM,Date=8/26/2014, 时间=下午 6:36:40
评论
getTimezoneOffset
getCurrentTimeUTC
getTime
tmLoc.getTime()
§15.9.3.3 中明确设置为 UTC 的 。PrimitiveValue
tmLoc
new Date()
tmLoc.toString()
tmLoc.getTime()
//The offset is in minutes -- convert it to ms
我想澄清一下,new Date().getTime() 实际上确实返回了一个 UTC 值,因此它是一种非常有用的方式,可以以与本地化时间无关的方式存储和管理日期。
换句话说,不要为所有的UTC javascript函数而烦恼。相反,只需使用 Date.getTime()。
有关解释的更多信息,请参见此处:如果 javascript “(new Date()).getTime()” 从 2 个不同的时区运行。
如果你想要一个衬垫,UTC Unix 时间戳可以在 JavaScript 中创建为:
var currentUnixTimestap = ~~(+new Date() / 1000);
这将考虑系统的时区。它基本上是自纪元以来经过的时间(以秒为单位)。
工作原理:
- 创建日期对象 : .
new Date()
- 通过在对象创建之前添加来转换为时间戳,以将其转换为 .: .
unary +
timestamp integer
+new Date()
- 将毫秒转换为秒:
+new Date() / 1000
- 使用双波浪号将值四舍五入为整数。:
~~(+new Date())
评论
以传统格式获取 UTC 时间的最简单方法如下:
> new Date().toISOString()
"2016-06-03T23:15:33.008Z"
如果需要 EPOC 时间戳,请将日期传递给 Date.parse 方法
> Date.parse(new Date)
1641241000000
> Date.parse('2022-01-03T20:18:05.833Z')
1641241085833
或者,您可以使用 + 进行从 Date 到 Int 的类型转换
> +new Date
1641921156671
EPOC 时间戳(以秒为单位)。
> parseInt(Date.parse('2022-01-03T20:18:05.833Z') / 1000)
1641241085
> parseInt(new Date / 1000)
1643302523
评论
我使用以下内容:
Date.prototype.getUTCTime = function(){
return this.getTime()-(this.getTimezoneOffset()*60000);
};
定义此方法后,您可以执行以下操作:
var utcTime = new Date().getUTCTime();
评论
DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
this.getTime()
我认为这是一个更好的解决方案
// UTC milliseconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()
// UTC seconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0
评论
我认为这是你所期待的......
var currTimestamp = Date.now(), //1482905176396
utcDateString = (new Date(currTimestamp)).toUTCString(); //"Wed, 28 Dec 2016 06:06:50 GMT"
现在
new Date(utcDateString).getTime(); //This will give you UTC Timestamp in JavaScript
评论
new Date().toUTCString()
这将返回 UTC 格式的时间戳:
var utc = new Date(new Date().toUTCString()).getTime();
评论
new Date(new Date().toUTCString())
由于返回一个字符串,例如您可以对最后 3 个字符进行切片并将切片后的字符串传递给:new Date().toUTCString()
"Wed, 11 Oct 2017 09:24:41 GMT"
new Date()
new Date()
// Wed Oct 11 2017 11:34:33 GMT+0200 (CEST)
new Date(new Date().toUTCString().slice(0, -3))
// Wed Oct 11 2017 09:34:33 GMT+0200 (CEST)
一旦你这样做了
new Date(dateString).getTime() / 1000
它已经是UTC时间戳
const getUnixTimeUtc = (dateString = new Date()) => Math.round(new Date(dateString).getTime() / 1000)
我在 https://www.unixtimestamp.com/index.php 上进行了测试
只需做:
const time = new Date().getTime();
MDN 指出:
Date.prototype.getTime() 返回指定日期的数值,作为自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。(返回前一次的负值。
评论
new Date().toString()
new Date().toUTCString()
new Date().getTime()