如何在JavaScript中将没有偏移的字符串格式的UTC日期转换为本地时间?

时间:2015-10-16 14:46:31

标签: javascript jquery datetime

我收到了UTC时区的字符串格式化日期。我需要使用在用户的当前时区转换此日期时间。

我得到了这个:

9:43pm 16/10/2015 //this is UTC time, I am getting this via an ajax call

我需要将其转换为:

12:00pm 16/10/2015 //whatever time by that location

2 个答案:

答案 0 :(得分:4)

如果你可以分开选择那种格式,或者获得JavaScript可以解析的标准格式 - 你可以将它转换为Date对象。我没有看到该日期的偏移量,当JavaScript试图解析它时会出现问题。假设这就是你所拥有的,我们可以使用以下内容强制生成UTC日期......

// ------- new Date(Date.UTC(year, month, day, hour, minute, second))
var date = new Date(Date.UTC(2015, 9, 16, 21, 43, 0));

console.log(date) // Fri Oct 16 2015 15:43:00 GMT-0600 (Mountain Daylight Time (Mexico))
  • 请注意,month中的Date.UTC为零,例如十月将是9
如果格式正确,

new Date(value)会自动为我们执行此操作 - 其中value是您收到的实际日期值 - 但该格式不会按原样解析。如果无法绕过该格式,您可以在上面的示例中对其进行操作。以下是针对您的示例的未经测试的算法...

var formatted = '9:43pm 16/10/2015'

function createDateUTC(formatted) {

    var hourOffset =  formatted.split(' ')[0].split(':')[1].match(/[a-zA-Z]+/g)[0] === 'pm' ? 12 : 0

    var year = parseInt(formatted.split('/').pop());
    var month = parseInt(formatted.split('/')[1]) - 1;
    var day = parseInt(formatted.split('/')[0].split(' ').pop());
    var hour = hourOffset + parseInt(formatted.split(' ')[0].split(':')[0]);
    var minute = parseInt(formatted.split(' ')[0].split(':')[1]);

    return new Date(Date.UTC(year, month, day, hour, minute, 0));
}

var myDate = createDateUTC(formatted);

JSFiddle Link - 工作演示

查看UTC()Date Object文档以获取更多信息

此外,为了获得您想要的确切格式,我们可以引入更多功能,这些功能将为我们提供12:00pm 16/10/2015格式

function formatAMPM(date) {
    var hours = date.getHours();
    var minutes = date.getMinutes();
    var ampm = hours >= 12 ? 'pm' : 'am';
    hours = hours % 12;
    hours = hours ? hours : 12; // the hour '0' should be '12'
    minutes = minutes < 10 ? '0'+minutes : minutes;
    var strTime = hours + ':' + minutes + '' + ampm;
    return strTime;
}

function formatMMDDYYYY(inputFormat) {
    function pad(s) { return (s < 10) ? '0' + s : s; }
    var d = new Date(inputFormat);
    return [pad(d.getDate()), pad(d.getMonth()+1), d.getFullYear()].join('/');
}

console.log(formatAMPM(myDate) + ' ' + formatMMDDYYYY(myDate));
// Mountain Daylight Time => -- 3:43pm 16/10/2015

JSFiddle Link - 格式化示例

如果您计划进行繁重的日期格式化和操作,我会重新调查Moment.js

总体而言 - 对此最好的解决方案是从服务器返回可接受的格式,将其本地解析为本地时间,例如: new Date(),并使用强大的格式库,而不是滚动自己的格式库以显示它的方式。

答案 1 :(得分:1)

您应该稍微处理该字符串以提取年,月,日,小时和分钟。

然后,您可以使用以下命令创建具有该UTC日期的本地日期:

var time = new Date ( Date.UTC('year', 'month', 'day', 'hour', 'minute') );

就我而言,'2015年10月16日下午9:43'返回:'2015年11月16日星期一07:43:00 GMT-0200(Hora de verano de Argentina)'。