我有一個具有給定時區的認證用戶, 「柏林,GMT + 1」。對於這個問題的緣故,讓我們說我有這個在全球範圍內:什麼是用Javascript處理時區的最佳方式
var timeZone = "Berlin";
var gmtDistance = 1;
什麼是最好的解決方案將所有的日期相關的JS到相應的行爲,這意味着如果我創建一個新的Date對象它將考慮到時區。
我想那會很簡單,但我似乎還沒有找到做這在谷歌/ SO的完美方式。我會特權一個不需要任何外部庫的答案。
我有一個具有給定時區的認證用戶, 「柏林,GMT + 1」。對於這個問題的緣故,讓我們說我有這個在全球範圍內:什麼是用Javascript處理時區的最佳方式
var timeZone = "Berlin";
var gmtDistance = 1;
什麼是最好的解決方案將所有的日期相關的JS到相應的行爲,這意味着如果我創建一個新的Date對象它將考慮到時區。
我想那會很簡單,但我似乎還沒有找到做這在谷歌/ SO的完美方式。我會特權一個不需要任何外部庫的答案。
這樣的事情呢?
http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/
var rightNow = new Date();
var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
var temp = jan1.toGMTString();
var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var std_time_offset = (jan1 - jan2)/(1000 * 60 * 60);
我的選擇是使用存儲UTC時間在服務器端的所有日期,而當我在處理數據通過AJAX調用回來,創建一個全球性的處理,做一些分析。
下面的例子可以讓你簡單地使用:
app.ajax({
url: '/My/Post/Url',
data: {
MyProperty: 'MyValue'
},
success: function (data, status, xhr) {
// Do stuff here...
},
error: function (xhr, settings, error) {
// Do stuff here...
}
});
但是,它預先解析通過UTC時間日期固定在本地時區中的「成功」功能的「數據」元素的任何返回值。請注意 - 執行此操作後,如果您進一步處理數據,則需要在將數據發送回服務器之前對其進行修復,否則您將使用偏移量進行備份。
var app = window.app = $.extend(true, {}, app, {
// Creating a namespace for my app which is safe across multiple files.
ajax: function (options) {
var defaultSettings = {
type: 'POST',
async: true
};
// Capture the settings.
var settings = $.extend(true, {}, defaultSettings, options);
// Install our general handlers;
if (settings.success) {
settings.success = function (data, textStatus, jqXHR) {
app.OnPostSuccess(data, textStatus, jqXHR, options.success);
}
} else
settings.success = app.OnPostSuccess;
if (settings.error) {
settings.error = function (jqXHR, ajaxSettings, thrownError) {
app.OnPostError(event, jqXHR, ajaxSettings, thrownError, options.error);
}
} else
settings.error = app.OnPostError;
$.ajax(settings);
},
OnPostSuccess: function (data, textStatus, jqXHR, fn_after) {
// Do my generalized success handling here.
// Fix Dates.
var fixedData = app.FixDate(data);
// Call any other handler that's been specified.
if (typeof fn_after === 'function')
fn_after(fixedData, textStatus, jqXHR);
},
OnPostError: function (jqXHR, ajaxSettings, thrownError, fn_after) {
// Do my generalized error handling here.
// Call any other handler that's been specified.
if (typeof fn_after === 'function')
fn_after(jqXHR, ajaxSettings, thrownError);
},
FixDate: function (obj) {
var fixed = obj;
if (typeof obj == 'string' && obj.indexOf('\/Date(') == 0) {
// Microsoft date "/Date(12345678)/" - convert to real date.
fixed = new Date(parseInt(fixed.substr(6, fixed.length - 8), 10));
}
if (typeof fixed === 'object') {
if (fixed.getTimezoneOffset) {
// If the value is a date, apply timezone correction.
var now = new Date();
var offset = now.getTimezoneOffset(); // # of minutes from GMT.
fixed = new Date(fixed.getTime() + offset * 60000);
// This updates the value based on the offset.
} else {
// Otherwise, update each of its properties.
// This fixes objects with dates for properties, recursively.
$.each(fixed, function (index, value) {
fixed[index] = app.FixDate(value);
});
}
}
return fixed;
}
});
所有這些設置都可以達到此目的。如果您現在在OnPostSuccess中處理日期等事情,則可以確保它們始終處於正確的格式,並且始終處於正確的時區。
var MyObj = {
MyDate: "\/Date(12345678)\/"
};
console.log('Before: ', MyObj.MyDate);
MyObj = app.FixDate(MyObj);
console.log('After: ', MyObj.MyDate);
在行動中看到的例子,看看下面的jsfiddle:
無論您使用上述AJAX方法,你可以按如下方式使用FixDate方法
http://jsfiddle.net/TroyAlford/TBNVV/
注意:這還包括AJAX位 - 但它們不在示例中使用 - 僅在此處纔有完整性。
也許Dojo工具包可以給你一些想法[由於這樣的事實,即你不希望外部庫;)]
Dojo Toolkit的有一個很好類日期/時間處理及全本地化支持,即使有時區支持。 http://dojotoolkit.org/api/1.6/dojo/date
感謝您的回答,但它似乎沒有最優 – marcgg
僅供參考,該帖子的作者建議使用https://bitbucket.org/pellepim/jstimezonedetect代替 – Denis