簡體   English   中英

使用帶有from.ow()或from()的moment.js的時區

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM