2017-04-13 59 views
0

我有一個AngularJS,我從後端服務調用中獲取日期值。我從後端收到的日期是一個字符串。例如。 「2017年4月13日」。當我嘗試在用戶界面上顯示此內容時,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 「等基於客戶的時區。因此,日期不會更改,並且用戶界面上不會顯示休息日。我怎樣才能在Javascript中實現這一點。 Moment.js和moment-timezone.js是否需要實現這一點?如何將日期轉換爲JavaScript中的本地等效日期

回答

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

沒有,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) 
1

爲什麼日期似乎是不正確的原因,設置Why does Date.parse give incorrect results。該答案還指出了爲什麼不應該使用Date構造函數或Date.parse解析字符串。

要可靠地解析ISO 8601格式日期爲本地需要一個簡單的功能。以下內容也會驗證這些值,並在月份或日期超出範圍時返回無效日期。如果你想的時候是中午,然後設置小時12

function parseISOLocal(s) { 
 
    var b = s.split(/\D/); 
 
    var d = new Date(b[0], --b[1], b[2]); 
 
    return d && d.getMonth() == b[1]? d : new Date(NaN); 
 
} 
 

 
var d = parseISOLocal('2017-04-13'); 
 
d.setHours(12); 
 
console.log(d.toString());

相關問題