JavaScript -- 使用UTC偏移量获取当前日期

5

如何根据UTC偏移量获取当前日期?例如,澳大利亚的UTC偏移量为UTC +10:00,已经是5月24日了。

我可以获取UTC日期和小时,但找不到任何可以考虑UTC偏移量的日期方法。


1
更简单的方法可能是使用moment.js:http://momentjs.com/timezone/ - Frax
澳大利亚及其领土拥有多个时区,范围从+05:00到+11:00。 - RobG
3个回答

11

一旦你有了偏移量(在这种情况下是10小时),使用以下函数:

function getDateWithUTCOffset(inputTzOffset){
    var now = new Date(); // get the current time

    var currentTzOffset = -now.getTimezoneOffset() / 60 // in hours, i.e. -4 in NY
    var deltaTzOffset = inputTzOffset - currentTzOffset; // timezone diff

    var nowTimestamp = now.getTime(); // get the number of milliseconds since unix epoch 
    var deltaTzOffsetMilli = deltaTzOffset * 1000 * 60 * 60; // convert hours to milliseconds (tzOffsetMilli*1000*60*60)
    var outputDate = new Date(nowTimestamp + deltaTzOffsetMilli) // your new Date object with the timezone offset applied.

    return outputDate;
}

在你的情况下,你需要使用:

var timeInAustralia = getDateWithUTCOffset(10);

这将返回一个Date对象。您仍需要根据自己的喜好格式化日期。

我同意@Frax,如果您不介意在项目中添加额外的依赖项,则Moment是一个很棒的库。

祝你好运


并非所有的偏移量都是整小时。它们通常表示为像“+05:30”或“+0530”这样的字符串。 - RobG
在这种情况下,您可以将5.5作为inputTzOffset使用。 - victmo

2

日期对象有UTC方法,因此如果您有一个像+10:00这样的偏移量,可以将其简单地应用于UTC时间,然后读取生成的UTC值。该偏移量可以作为小时和分钟应用,也可以转换为单个值并应用,例如:

/*  Return a date in yyyy-mm-dd format for the provided offset
**  @param {string} offset - offset from GMT in format +/-hh:mm
**                         - default sign is +, default offset is 00:00
**  @returns {string} date at pffset in format yyyy-mm-dd
*/
function dateAtOffset(offset){
  function z(n){return (n<10?'0':'') + n}
  var d = new Date();
  var sign = /^\-/.test(offset)? -1 : +1;
  offset = offset.match(/\d\d/g) || [0,0];
  d.setUTCMinutes(d.getUTCMinutes() + sign*(offset[0]*60 + offset[1]*1))
  return d.getUTCFullYear() + '-' + z(d.getUTCMonth() + 1) + '-' + z(d.getUTCDate());
}

var offset = '+10:00';
document.write('The date at GMT' + offset + ' is: ' + dateAtOffset(offset));

您还可以调整日期的偏移量并读取“本地”值:

function timeAtOffset(offset) {
  var d = new Date();
  var sign = /^\-/.test(offset)? -1 : 1;
  offset = offset.match(/\d\d/g) || [0,0];
  d.setMinutes(d.getMinutes() + d.getTimezoneOffset() + sign*(offset[0]*60 + offset[1]*1));
  return d;
}

var offset = '-04:00';
document.write('Time at GMT' + offset + ' is: ' + timeAtOffset(offset))

请注意,默认的toString方法会报告本地时区偏移量,而不是已调整的时区偏移量,因此在使用此对象时要小心。


2

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