[英]Using timezones with moment.js fromNow() or from()
我想向用戶顯示自執行操作以來已經過了多長時間。
發生操作的日期+時間存儲在服務器的服務器時區中。 這就是造成麻煩的原因,因為如果用戶的計算機的時區比服務器的時區提前12小時,那么如果用戶現在添加了一些內容,則moment.js將顯示'12小時前'作為fromNow()
的輸出而just now
為了解決這個問題,我正在嘗試以下方法:
var actionTime = moment( action.timeStamp);//time of when user performed action
var serverTime = moment().zone('-07:00'); //current server time
console.debug( serverTime);//outputs Wed Sep 11 2013 15:19:51 GMT-0700
var timeAgo = serverTime.from( actionTime);
但盡管如此, timeAgo
仍然顯示客戶端的時區與服務器的時區之間的差異(即顯示'12小時前'而不是'現在');
任何人都知道如何解決這個或我做錯了什么?
理想情況下,您希望將UTC時間戳從服務器傳遞到客戶端。 這並不意味着您必須將整個服務器切換到UTC,這只是意味着您可以在通過Web發送之前將數據庫中的時間轉換為服務器上的UTC。 當然,如果你實際存儲了UTC時間,那會更好,但是你說你現在無法進行那種改變。 但是,讓我們假設您無法在服務器上進行任何更改。
我們還假設您的服務器固定為UTC-07:00偏移量。 在現實生活中,只有亞利桑那州不遵守夏令時的地方才會這樣。 因此,如果您在洛杉磯並且在太平洋時間,那么您的一些數據基於UTC-07:00,但其中一些數據基於UTC-08:00。 如果你想用JavaScript做這件事,那還需要做更多的工作。
我們還假設輸入已經是ISO8601格式的字符串。 (如果不是,請告訴我,我會調整此代碼。)
var s = "2013-09-11 18:00:00"; // from action.timeStamp
var actionTime = moment(s + "-07:00", "YYYY-MM-DD HH:mm:ssZ");
var timeAgo = actionTime.fromNow();
您的其他代碼不起作用的原因是因為在第一行中,您受瀏覽器時區的影響。 第二行中的區域設置器只更改區域以進行格式化,而不是更改實際時刻。
此外,當您將時刻轉儲到控制台進行調試時,請確保將其格式化為輸出。 否則,您只是查看其內部屬性值,這可能會或可能沒有直接意義。
我以不同的方式解決了這個問題,也許這個選項在提出問題時無法回復,但現在可能更容易了。
我使用了moment-timezone.js (需要moment.js 2.6.0+)。
我將默認時區設置為我的服務器時區,如下所示:
moment.tz.setDefault("America/New_York"); // "America/New_York" in my case
然后正常使用它。 fromNow()
將使用客戶端中的時區來計算自那時起已經過去的時間。
moment(myDatetime).fromNow();
我有同樣的問題,並使用上述注釋來修改我的代碼。 我做了以下事情來解決它:
transform(value: string) {
var time = moment(value).utc();
return moment(time, "YYYYMMDD").fromNow();
}
在應用.fromNow()之前,我錯過了.utc()來轉換它
需要注意的是,這是在Pipe for Ionic 3中使用的,上面的代碼來自管道邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.