如何在Javascript中检查日期是否为UTC时间?

3

我看了这个问题:如何将JavaScript日期转换为UTC?

根据这个问题,我在dateTools模块中实现了以下转换:

[更新]

var dt, utcTime;
dt = new Date();
utcTime = new Date(Date.UTC(dt.getFullYear(), 
                                        dt.getMonth(), 
                                        dt.getDate(), 
                                        dt.getHours(), 
                                        dt.getMinutes(), 
                                        dt.getSeconds(), 
                                        dt.getMilliseconds()));

现在我想编写单元测试。我的想法是检查结果是否实际上是UTC,但我不知道如何做。
所有toString,toUTCString和类似的方法对于输入(非UTC)和输出(UTC)日期似乎都是相同的。
只有getTime方法的结果不同。
在JavaScript中有没有一种检查日期是否为UTC的方法?如果没有,有没有更好的方法来进行单元测试?
为了提供更多背景:
仅将其转换为UTC字符串并不那么有用,因为在下一步中,日期将被发送到Asp.net服务,并因此转换为以下格式的字符串:
'/Date([time])/'

使用这段代码
var aspDate = '/Date(' + date.getTime() + ')/';

3
为什么你要链接到这个问题? - Dave Newton
@DaveNewton机器人正在为其“主人”努力获得“狂热者”徽章。 - Engineer
你不能只拿一个已知的非UTC时间,通过你的转换器运行它,然后检查它是否返回正确的UTC时间吗? - Dave Newton
1
我认为默认是UTC时间,不是吗? - bfavaretto
@Engineer 不是在您连续访问网站100天后获得的 Fanatic 徽章吗? - keune
显示剩余2条评论
2个回答

10
var aspDate = '/Date(' + date.getTime() + ')/';

This输出内部UNIX epoch值(UTC),它表示时间戳。您可以使用各种toString方法来获取该时间戳的更详细的字符串表示:

  • .toString() 使用用户的时区,结果类似于 "Fri Jan 25 2013 15:20:14 GMT+0100"(至少对我而言,你可能生活在不同的时区)
  • .toUTCString() 使用 UTC,结果将类似于 "Fri, 25 Jan 2013 14:20:15 GMT"
  • .toISOString() 使用 UTC,并根据 ISO 格式化日期字符串:"2013-01-25T14:20:20.061Z"

那么我们如何构建我们想要的时间值呢?

  • new Date()Date.now()会返回当前日期时间。无论用户所在时区是什么,时间戳都代表的是当前时刻。
  • new Date(year, month, …)使用用户所在时区构建一个时间戳。如果你希望这个时间戳在你的用户群体中保持一致,那么你就会遇到麻烦。即使不使用时间值,只使用日期也可能导致奇怪的误差
    • 你可以使用setYearsetMonth…和getYeargetMonth…方法来设置/获取现有日期的单个值,并根据用户所在时区进行调整。这适用于从/输出到用户的输入。
    • getTimezoneOffset()允许您查询将用于所有这些操作的时区
  • new Date(timestring)Date.parse不能被信任。如果你给它们一个没有明确时区标识的字符串,浏览器可能会随机处理。如果你想提供一个格式正确的字符串,你可能会发现有些浏览器不接受它(特别是旧版IE)。
  • Date.UTC(year, month, …)允许您从UTC时区的值构建一个时间戳。这对于UTC字符串的输入/输出非常方便。
    • 每个get/set方法都有一个UTC等效方法,您也可以用它们进行这些操作。
你现在可以看到,你获取用户时区值并将其用作UTC时间的方法可能有缺陷。这意味着dtutcTime的值可能不正确,尽管使用错误的输出方法可能使其看起来正确。

您提议仅使用 getTime 而不将其转换为 UTC。但我如何知道服务器的时区呢? - stefan.s
1
getTime иҝ”еӣһиҮӘ1970е№ҙ1жңҲ1ж—Ҙ00:00 UTCд»ҘжқҘзҡ„жҜ«з§’ж•°пјҢжӮЁйңҖиҰҒзҹҘйҒ“е“ӘдёӘж—¶еҢәпјҹ - Bergi
哦,我错过了getTime总是返回UTC的要点。但这是否意味着这个问题/回答是错误的:https://dev59.com/inNA5IYBdhLWcg3wdtv5。抱歉,我很困惑。 - stefan.s
你是指那个九十票的答案吗?是的,那是无意义的。只有在使用错误的输出方法时才需要它。 - Bergi
谢谢。我学到了很多。看起来我问错了问题。我想我需要重新考虑dateTools模块... - stefan.s

0
  • getTimezoneOffset

    语法:object.getTimezoneOffset( ) 此方法返回本地时间与格林威治标准时间之间的分钟差异。由于使用夏令时的实践,此值并非常数,可能会发生变化。

即:

var myDate = new Date;
var myUTCDate = new Date(myDate - myDate.getTimezoneOffset() * 60000);
alert(myUTCDate);

注意:60000是一分钟的毫秒数;


时区偏移量对于转换和未转换的日期是相等的。 - stefan.s
我已经知道如何将日期转换为UTC。但是,我该如何编写一个单元测试呢? - stefan.s
@stefan.s:您不需要将日期转换为UTC。您只需要输出它所代表的时间戳作为UTC即可。请展示一下您是如何“转换”它的。 - Bergi
@stefan.s 你的日期数值是从哪里来的? - ic3b3rg
@ic3b3rg 在生产环境中:可能在任何地方,客户端和服务器之间的不同时区应该被预期。对于单元测试:目前是UTC+1,但测试不应该需要特定的时区,它们应该可以在任何地方运行。 - stefan.s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接