[英]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:25
( 12:25 AM
),但實際上是2015-04-13 17:25
( 5: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')));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.