如何在JavaScript中将日期转换为本地等效日期

时间:2017-04-13 18:24:50

标签: javascript angularjs date momentjs

我有一个AngularJS,我从后端服务调用中获取日期值。我从后端收到的日期是一个字符串。例如。 " 2017年4月13日&#34 ;.当我尝试在UI上显示此内容时,javascript将其转换为本地时间" 2017-04-12 17:00:00 CST"由于这个在UI上,它显示了休息一天。我想要实现的目标是展示" 2017-04-13 12:00:00 EST"或" 2017-04-13 12:00:00 PST"或" 2017-04-13 12:00:00 CST"等等基于客户的时区。因此,日期不会更改,并且UI上不会显示休息日。我怎样才能在Javascript中实现这一点。需要Moment.js和moment-timezone.js来实现这个目标吗?

3 个答案:

答案 0 :(得分:1)

您可以尝试使用时区偏移量,它可以为您提供与本地时区的UTC偏移的分钟数。

let myDate = new Date('2017-04-13');
myDate = new Date(myDate.getTime() + (myDate.getTimeZoneOffset() * 60 * 1000));

或者我重构了一个我以前使用过的旧函数来处理你的用例,这可能有点矫枉过正但是它有效:

Date.prototype.format = function(format) {
    var result = "";

    format = format.replace("mm", this.getUTCMonth() + 1 < 10 ? "0" + (this.getUTCMonth() + 1) : this.getUTCMonth() + 1);
    format = format.replace("m", this.getUTCMonth() + 1);
    format = format.replace("dd", this.getUTCDate() < 10 ? "0" + this.getUTCDate() : this.getUTCDate());
    format = format.replace("d", this.getUTCDate());
    format = format.replace("yyyy", this.getUTCFullYear());
    format = format.replace("yy", String(this.getUTCFullYear()).substring(String(this.getUTCFullYear()).length - 2));

    format = format.replace("HH", this.getUTCHours() < 10 ? "0" + this.getUTCHours() : this.getUTCHours());
    format = format.replace("H", this.getUTCHours());
    format = format.replace("hh", this.getUTCHours() == 0 ? "12" : this.getUTCHours() < 10 ? "0" + this.getUTCHours() : this.getUTCHours());
    format = format.replace("h", this.getUTCHours() == 0 ? "12" : this.getUTCHours());
    format = format.replace("nn", this.getUTCMinutes() < 10 ? "0" + this.getUTCMinutes() : this.getUTCMinutes());
    format = format.replace("n", this.getUTCMinutes());
    format = format.replace("ss", this.getUTCSeconds() < 10 ? "0" + this.getUTCSeconds() : this.getUTCSeconds());
    format = format.replace("s", this.getUTCSeconds());
    format = format.replace("p", this.getUTCHours() >= 12 ? "PM" : "AM");
    format = format.replace("t", new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]);

    return format;
};

let myDate = new Date('2017-04-13');
myDate.format('yyyy-mm-dd HH:mm:ss t');
// Output -> 2017-04-13 00:00:00 EDT

答案 1 :(得分:1)

不,不需要Moment.js。我有同样的问题,并决定使用$filter更改日期的格式,以允许Javascript日期解析器以不同方式解析它:

var correctDate = new Date($filter('date')(backEndDate, 'MMMM d, yyyy'));

所以不是解析:

new Date('2017-04-13') // Wed Apr 12 2017 19:00:00 GMT-0500 (Central Daylight Time)

您正在解析:

new Date('April 13, 2017');  //Thu Apr 13 2017 00:00:00 GMT-0500 (Central Daylight Time)

答案 2 :(得分:1)

由于日期出现的原因不正确,请设置Why does Date.parse give incorrect results。该答案还指出了为什么不应该使用Date构造函数或Date.parse解析字符串。

要可靠地解析ISO 8601格式日期,因为本地需要一个简单的功能。如果月份或日期超出范围,以下内容还会验证值并返回无效日期。如果你想要时间是中午,那么将小时数设置为12。

SUMIF(D$2:D$1048576,1,B$2:C$1048576)