簡體   English   中英

客戶端處理UTC日期

[英]Handling UTC dates client side

情況如下:

我有occurred_at存儲在我的UTC數據庫日期。 我使用laravel編寫返回包含這些記錄的API方法occurred_at領域。 當前,它們通過JSON以字符串格式(PHP Carbon庫輸出的內容)返回,例如:

"occurred_at":"2015-04-14 00:25:20"這個日期“發生”時間是UTC時區的00:2512:25 AM ),但實際上是2015-04-13 17:255:25 PM ),太平洋(PST)時區。

我正在使用angular來使用JSON,並弄清楚了我會使用angular-moment庫將UTC轉換為本地。 但這不起作用。 角矩和本機角濾波器都輸出相同的東西:

<span>{{evt.occurred_at | amDateFormat:'L LT'}}</span> <span>{{evt.occurred_at | amDateFormat:'L LT'}}</span> <span>{{evt.occurred_at | date:'MM/dd/yyyy @ h:mma'}}</span> <span>{{evt.occurred_at | date:'MM/dd/yyyy @ h:mma'}}</span>

輸出:

2015-04-14 00:25:20

仍在UTC。 在我的角度應用程序代碼中,我甚至具有UTC預處理程序設置,可以將它們讀取為UTC,但它們不會顯示為本地時間:

.constant('angularMomentConfig', { preprocess: 'utc' })

有一種解決此問題的標准方法-將datetime值存儲在數據庫中的UTC中,但將其顯示為本地時間給用戶。 我需要在服務器端進行一些更改嗎? 客戶端? 什么是最佳實踐,即在我要顯示的每個日期都無需編寫大量代碼的情況下,使用“有效”方法?

當前,在非角度項目中,我通過將css類應用於我想要將時間轉換為本地時間的每個跨度,來使用我認為是“ hack”的東西:

$('.utc-dttm').each(function () {
    var t = moment.utc($(this).text()).local();
    $(this).text(t.format("L") + ' ' + t.format("LT"));
});

但是我認為這是錯誤的解決方法。

由於有效的JSON日期時間字符串格式為ISO-8601格式,因此您應讓Carbon將日期值轉換為此格式,然后再通過toIso8601String將其返回給客戶端,例如:

$occurred_at->toIso8601String();

這將日期字符串輸出為

2015-04-14T00:25:20Z

哪個javascript和任何日期擴展庫應本地解析為UTC時區,並在輸出給用戶時調整為客戶端時區。

您不能只是做另一個可以為您節省時間的功能嗎? 像,首先獲得節省時間的功能:

localStorage.setItem('time', +new Date);

要轉換它:

function toTimeZone(time, zone) {
var format = 'YYYY/MM/DD HH:mm:ss ZZ';
return moment(time, format).tz(zone).format(format);

}

當您要檢索它時:

new Date(parseInt(localStorage.getItem('time')));

來源: 在JavaScript + 存儲日期 中將日期轉換為另一個時區, 並從本地存儲中檢索

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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