将日期对象转换为不同时区的同一时间并获取其时间戳

时间:2017-02-27 15:25:39

标签: javascript date timezone timestamp datetime-format

我有一个GMT + 1日期对象Wed Feb 01 2017 00:00:00 GMT+0100 (CET)。我想将此对象转换为格式相同的GMT + 0:

GMT:2017年2月1日00:00:00 GMT;

当我解析我的对象时,它返回的时间戳等于Tue, 31 Jan 2017 23:00:00 GMT

如何将我的GMT + 1日期对象转换为时间戳等于GMT + 0中的相同日期?我试图使用moment.js,但我无法处理。

@edit

带有解释here

的代码

// User chooses 1st Feb 2017, but since components works with GMT +1
const userChoice = new Date(2017, 01, 01, 0, 0, 0)
// And backend works with timestamps I parse userChoice
const timestamp = moment(userChoice).valueOf()
// Which gives me timestamp equal to 31st of Dec 2016
console.log(timestamp, moment(timestamp).utc().format('DD/MM/YYYY hh:mm:ss Z'))
// But I want to have the same date as user chooses, but in a specific (GMT+0) timezone
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

3 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。我们将调用date object&#34; mod&#34;这给了我们Wed Feb 01 2017 00:00:00 GMT+0100

const mod = new Date(1485903600000)

现在我们将创建一个变量,它为我们提供完全相同时间(例如,日,小时等)的时间戳,但是以UTC为单位。

const utc = Date.UTC(mod.getFullYear(), mod.getMonth(), mod.getDate(), mod.getHours(), mod.getMinutes(), mod.getSeconds()) 如果我们想检查我们的时间戳是否正确,我们可以使用此时间戳和console.log创建新的日期。

console.log(1485907200000) // Wed Feb 01 2017 01:00:00 GMT+0100 <=> Wed Feb 01 2017 00:00:00 GMT+0000

答案 1 :(得分:0)

我不清楚你要做什么。看看你的代码:

// User chooses 1st Feb 2017, but since components works with GMT +1
const userChoice = new Date(2017, 01, 01, 0, 0, 0)

这将在主机系统时区创建一个相当于2017年2月1日午夜的Date对象。

// And backend works with timestamps I parse userChoice
const timestamp = moment(userChoice).valueOf()

你不是解析&#34; userChoice ,它是一个Date对象。您正在获取时间值,该值是自1970-01-01T00:00:00Z以来以毫秒为单位的偏移量,相当于userChoice.getTIme()

// Which gives me timestamp equal to 31st of Dec 2016
console.log(timestamp, moment(timestamp).utc().format('DD/MM/YYYY hh:mm:ss Z'))

不,它没有。原始日期是2月1日,它只能按时区移动最多一天。对于设置为格林威治以西时区的主机,创建日期时的时区调整将表示UTC日期为2月1日,但对于东部主机,UTC日期将为1月31日。

// But I want to have the same date as user chooses, but in a specific (GMT+0) timezone

要为特定的UTC日期创建日期,请使用UTC方法。或者,如果您有Date对象,则可以通过主机偏移量进行调整:

&#13;
&#13;
// Create date for 1 Feb, 2017 based on host offset
var d = new Date(2017, 1, 1);

// Create UTC Date for same date
var u = new Date(Date.UTC(2017,1,1));

console.log('Local: ' + d.toISOString());
console.log('UTC  : ' + u.toISOString());

// Adjust d for timezone offset
d.setMinutes(d.getMinutes() - d.getTimezoneOffset())
console.log('Adjusted: ' + d.toISOString());
&#13;
&#13;
&#13;

如果这没有帮助,请更新问题。

答案 2 :(得分:0)

日期对象无法转换为不同的时区,因为它只保留自1970年1月1日以来经过的毫秒数,并且对于世界各地的所有地方都是相同的。 / p>

但是,日期对象可能会根据时区偏移值在不同的时区(也称为本地时间)进行解释。

您甚至不需要知道时区偏移的固定值; 让计算机为您照顾它,因为它还包括在不同地点和正确的时间之间夏季夏令时的变化。 您需要知道的是可以在iana.org网站查找的时区说明。

let now = new Date(),
    current = Intl.DateTimeFormat().resolvedOptions().timeZone,
    zones = [current , 'Europe/London', 'Asia/Tokyo'];

zones.forEach((z)=>{
  console.log("Time in "+ z + " is " +
               now.toLocaleString("en-ES",{timeZone: z}))
});