我有一个来自服务器的UTC格式的日期对象。
我想用它在客户端做一些日期运算,如添加日期等,并将其发送回服务器。
这样做:
var newDate = new Date(date); // cloning a date in utc
newDate.setDate(result.getDate() + 7); // expecting the new date to be in utc as well
保留原来的时区?
日期对象没有时区。他们的一些方法,如getDate
(相对于getUTCDate
)或toString
使用当地时区来计算他们返回的结果。
那么回答您的问题,是的,您的示例代码保留了原始时区。只要确保在序列化发送到服务器时,使用toISOString()
(或toJSON()
)而不是toString()
。
Date
对象内部只通过UTC跟踪值。它只保留一个数字,即从UTC时间1970年1月1日午夜开始经过的毫秒数。
也就是说,Date
对象的许多函数,包括构造函数,经常使用运行代码所在计算机的本地时区的值。例如,当您执行:new Date(2015,0,1)
时,虽然这将是您时区的1月1日午夜,但它将等同于特定的基于utc的时间戳(可以通过调用.getTime()
获得)。如果要在其他时区执行完全相同的操作,则会得到不同的时间戳。此外,如果您要获取时间戳并将其加载到其他时区的Date
对象中,您将获得不同的本地时间—甚至可能不在同一天!
:
我有一个来自服务器的UTC格式的日期对象。
由于直接传输Date
对象是不可能的,我假设您实际传输的是包含日期和时间值的字符串,该字符串被解析为为Date
对象,或者您传输的是基于utc的时间戳的数值,您将加载为Date
对象。
因此,询问是否保留原始输入的时区是没有意义的。您在第一次创建Date
对象时提供的任何输入都已经丢失了。所有Date
对象都是UTC时区的内部数字,或者投影到本地时区的数字。