Как уже упоминалось, ваш клиент должен сообщить вашему серверу ASP.Net подробности о том, в каком часовом поясе он находится.
Вот пример.
У меня есть контроллер Angular,который загружает список записей из моей базы данных SQL Server в формате JSON.Проблема в том, что значения DateTime
в этих записях находятся в часовом поясе UTC, и я хочу показать пользователю дату / время в их местном часовом поясе.
Я определяю часовой пояс пользователя (в минутах) с помощью функции JavaScript "getTimezoneOffset()
", затем добавляю это значение к URL-адресу службы JSON, которую я пытаюсь вызвать:
$scope.loadSomeDatabaseRecords = function () {
var d = new Date()
var timezoneOffset = d.getTimezoneOffset();
return $http({
url: '/JSON/LoadSomeJSONRecords.aspx?timezoneOffset=' + timezoneOffset,
method: 'GET',
async: true,
cache: false,
headers: { 'Accept': 'application/json', 'Pragma': 'no-cache' }
}).success(function (data) {
$scope.listScheduleLog = data.Results;
});
}
В своем коде ASP.Net я извлекаю параметр timezoneOffset
...
int timezoneOffset = 0;
string timezoneStr = Request["timezoneOffset"];
if (!string.IsNullOrEmpty(timezoneStr))
int.TryParse(timezoneStr, out timezoneOffset);
LoadDatabaseRecords(timezoneOffset);
... и передаю его в мою функцию, которая загружает записи из базы данных.
Это немного грязно, так как я хочу вызывать свою функцию C # FromUTCData
для каждой записи из базы данных, но LINQ to SQL не может объединить сырой SQL с функциями C #.
Решение состоит в том, чтобы сначала прочитать записи, а затем выполнить итерацию по ним, применяя смещение часового пояса к полям DateTime
в каждой записи.
public var LoadDatabaseRecords(int timezoneOffset)
{
MyDatabaseDataContext dc = new MyDatabaseDataContext();
List<MyDatabaseRecords> ListOfRecords = dc.MyDatabaseRecords.ToList();
var results = (from OneRecord in ListOfRecords
select new
{
ID = OneRecord.Log_ID,
Message = OneRecord.Log_Message,
StartTime = FromUTCData(OneRecord.Log_Start_Time, timezoneOffset),
EndTime = FromUTCData(OneRecord.Log_End_Time, timezoneOffset)
}).ToList();
return results;
}
public static DateTime? FromUTCData(DateTime? dt, int timezoneOffset)
{
// Convert a DateTime (which might be null) from UTC timezone
// into the user's timezone.
if (dt == null)
return null;
DateTime newDate = dt.Value - new TimeSpan(timezoneOffset / 60, timezoneOffset % 60, 0);
return newDate;
}
Это работает хорошо, хотяэтот код действительно полезен при написании веб-сервиса для отображения даты / времени пользователям в разных частях света.
Прямо сейчас я пишу эту статью в 11:00 по Цюрихскому времени, но если вы ее читалив Лос-Анджелесе вы увидите, что я редактировал его в 2 часа ночи (по местному времени).Используя такой код, вы можете заставить свои веб-страницы показывать время, которое имеет смысл для иностранных пользователей вашего сайта.
Фу.
Надеюсь, это поможет.