将本地时间转换为utc并添加到utc datetime时刻

时间:2018-03-12 23:54:53

标签: react-native momentjs utc

我有一个用户输入,用户输入年,月和日,我创建了一个日期对象

  let userDate = new Date(year, month, day)

然后从用户输入,用户输入分钟和小时(变量分钟和小时)

我需要将此日期和时间转换为UTC时间戳,使用时刻,我不确定。我可以做吗

  let utcTimestamp = moment.utc(date.toISOString()).hour(hours).minutes(minutes);

例如:如果用户输入的日期为13-Mar-2018,时间为8:45 AM(GMT时区),那么我可以使用上面的代码行来获取UTC时间戳,因为我可以直接添加小时和分钟到日期

如果用户输入的日期为2018年8月13日和时间8:45(由于夏令时变化而是GMT +1),那么在上面的行中我可能会创建错误的日期。

2 个答案:

答案 0 :(得分:2)

  

...我创建了一个日期对象

let userDate = new Date(year, month, day)

这里要小心,你需要从月份中减去1,因为Date而不是通常的1-12编号为0-11。

然后从用户输入,用户输入分钟和小时(变量分钟和小时)

  

我需要将此日期和时间转换为UTC时间戳,使用时刻......

你不需要Moment。只需在.toISOString()对象上调用Date即可。它在生成字符串之前隐式转换为UTC。

var utcString = new Date(year, month-1, day, hours, minutes).toISOString();
  

......我可以做吗

let utcTimestamp = moment.utc(date.toISOString()).hour(hours).minutes(minutes);

不,这没有意义。只有在当地时间输入日期但是以UTC格式输入时,这才有效。这种行为上的差异肯定会让您的用户感到困惑 - 特别是如果UTC日期与当地日期不同。

  

...如果用户输入的日期为2018年8月13日和时间8:45(由于夏令时变化而是GMT +1),那么在上面的行中我可能会创建错误的日期。< / p>

从本地时间到UTC的转换将自动考虑本地时区正在观察的任何夏令时调整。您无需自行进行任何其他调整。

答案 1 :(得分:0)

这是我用来将Outlook日历事件从UTC转换为本地时间的代码段。相同的技术可以用于其他情况。

//Get the users timezone
let timeZone = item.originalStartTimeZone;

//Get the start datetime in UTC time
let timeStart = item.start.dateTime;

//Calculate the negative offset. 
let offset = - timeStart.localeCompare(timeZone);

//Add the calculated offset to the UTC start time 
let localStartTime = addHours(timeStart, offset);