Я работаю на новостном сайте и сохраняю все даты в базе данных в UTC.Затем, в зависимости от браузера / местоположения машины, я хочу соответственно отобразить дату / время (конвертировать из UTC
в Местное время машины / браузера).
Прежде всего, я бы хотелзнаю, делаю ли я это так, как должно или нет (даты UTC в базе данных).
Во-вторых, мне интересно, почему это не так просто сделать в VB.NET
?Ниже приведены подходы, которые я пробовал, но ни один из них не работал по мере необходимости:
Подход 1:
TimeZoneInfo.ConvertTimeFromUtC
Это продолжало возвращать время сервера, а не время клиент / машина.
Подход 2:
Dim TimeZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Middle East Standard Time")
Dim Dated As DateTime = TimeZoneInfo.ConvertTimeFromUtC(TempDate, TimeZone)
Это сработало, но не так, как предполагалось.Это преобразовало дату / время UTC в базе данных в Ближневосточный часовой пояс , но любой пользователь из любого другого места в мире увидит только дату / время в Ближневосточный часовой пояс а не в реальном часовом поясе его места.Кроме того, я не уверен, учитывает ли преобразование DayLightSaving или нет.
Подход 3:
Я пытался исправить это с помощью JavaScript
,Я создал cookie , который сохраняет смещение из UTC, и попытался обработать offset в VB.NET
и выполнить преобразование.
<script>
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toUTCString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function getTimeOffset() {
var offset = new Date().getTimezoneOffset();
setCookie("_tz", offset);
}
</script>
JavaScripts
возвращает правильное смещение , и я сохраняю это смещение в cookie .Поскольку JavaScript
запускается после Page_Load
, я вызываю функцию JavaScript
getTimeOffset()
on Page_Init
:
ScriptManager.RegisterStartupScript(Me, Page.GetType, "Script", "getTimeOffset();", True)
Файл cookie создается до того, как страницаотображается, и смещение , сохраненное в cookie , является правильным (это то, что я действительно хочу!).Проблема здесь при первой загрузке.VB.NET
читает значение cookie как пустую строку при первой загрузке.На втором Page_Load
и далее VB.NET
читает значение cookie и правильно выполняет преобразование.
Подход 4
Попытка получить смещение, используя все примерыв этой скрипке но смещение всегда равно 0, что неверно.
Сводка
Интересно, есть ли какая-то функция, которую я пропустил в VB.NET
чтобы избежать всех этих хлопот.Не должно ли быть простой задачей преобразовать дату / время из UTC в местное?
Пожалуйста, дайте мне знать, если я что-то делаю неправильно или есть лучшая альтернатива.