Наше приложение было разработано для работы с пользователем из другого географического местоположения.
Мы не можем определить, какое текущее конечное пользовательское время и часовой пояс. Они выбирают другую культуру, такую как sv-se, en-us, ta-In даже они получают доступ из часовой пояс в Европе/Лондоне..
Мы размещали его на сервере хостинга в США, пользователи приложений от Norway/Denmark/Sweden/UK/USA/India
Проблема заключается в том, что мы использовали DateTime.Now
для хранения созданной/обновленной даты записи и т.д.
Поскольку Сервер работает в США, все пользовательские данные сохраняются как время США: (
После исследования в SO мы решили сохранить все даты истории в БД как DateTime.UtcNow
Проблема:
Существует запись, созданная на 29 Dec 2013, 3:15 P.M Swedish time
.
public ActionResult Save(BookingViewModel model)
{
Booking booking = new Booking();
booking.BookingDateTime = model.BookingDateTime; //10 Jan 2014 2:00 P.M
booking.Name = model.Name;
booking.CurrentUserId = (User)Session["currentUser"].UserId;
//USA Server runs in Pacific Time Zone, UTC-08:00
booking.CreatedDateTime = DateTime.UtcNow; //29 Dec 2013, 6:15 A.M
BookingRepository.Save(booking);
return View("Index");
}
Мы хотим показать одно и то же время истории для пользователя, который вошел в систему в Индии/Швеции/США.
В настоящее время мы используем текущего пользователя культуры, зарегистрированного и выбираем часовой пояс из файла конфигурации и используем для преобразования с классом TimeZoneInfo
<appSettings>
<add key="sv-se" value="W. Europe Standard Time" />
<add key="ta-IN" value="India Standard Time" />
</appSettings>
private DateTime ConvertUTCBasedOnCuture(DateTime utcTime)
{
//utcTime is 29 Dec 2013, 6:15 A.M
string TimezoneId =
System.Configuration.ConfigurationManager.AppSettings
[System.Threading.Thread.CurrentThread.CurrentCulture.Name];
// if the user changes culture from sv-se to ta-IN, different date is shown
TimeZoneInfo tZone = TimeZoneInfo.FindSystemTimeZoneById(TimezoneId);
return TimeZoneInfo.ConvertTimeFromUtc(utcTime, tZone);
}
public ActionResult ViewHistory()
{
List<Booking> bookings = new List<Booking>();
bookings=BookingRepository.GetBookingHistory();
List<BookingViewModel> viewModel = new List<BookingViewModel>();
foreach (Booking b in bookings)
{
BookingViewModel model = new BookingViewModel();
model.CreatedTime = ConvertUTCBasedOnCuture(b.CreatedDateTime);
viewModel.Add(model);
}
return View(viewModel);
}
Просмотр кода
@Model.CreatedTime.ToString("dd-MMM-yyyy - HH':'mm")
ПРИМЕЧАНИЕ. Пользователь может изменить культуру/язык до входа в систему. Это приложение на основе локализации, работающее на американском сервере.
Я видел NODATIME
, но я не мог понять, как это может помочь в веб-приложении с несколькими культурами, размещенном в другом месте.
Вопрос
Как я могу показать дату создания такой же даты записи 29 Dec 2013, 3:15 P.M
для пользователей, зарегистрированных в INDIA/USA/Anywhere`?
На данный момент моя логика в ConvertUTCBasedOnCuture
основана на регистрации пользователя в культуре. Это должно быть независимо от культуры, поскольку пользователь может войти в систему, используя любую культуру из Индии/США.
КОЛОНКА БАЗЫ ДАННЫХ
CreatedTime: SMALLDATETIME
ОБНОВЛЕНИЕ: ПОПЫТНОЕ РЕШЕНИЕ:
DATABASE COLUMN TYPE: DATETIMEOFFSET
Пользовательский интерфейс
Наконец, я отправляю текущее локальное время пользователя, используя нижеуказанный код Momento.js в каждом запросе
$.ajaxSetup({
beforeSend: function (jqXHR, settings) {
try {
//moment.format gives current user date like 2014-01-04T18:27:59+01:00
jqXHR.setRequestHeader('BrowserLocalTime', moment().format());
}
catch (e) {
}
}
});
ПРИМЕНЕНИЕ
public static DateTimeOffset GetCurrentUserLocalTime()
{
try
{
return
DateTimeOffset.Parse(HttpContext.Current.Request.Headers["BrowserLocalTime"]);
}
catch
{
return DateTimeOffset.Now;
}
}
после чего вызывается
model.AddedDateTime = WebAppHelper.GetCurrentUserLocalTime();
В представлении
@Model.AddedDateTime.Value.LocalDateTime.ToString("dd-MMM-yyyy - HH':'mm")
В поле отображается локальное время для пользователя, однако я хочу видеть как dd-MMM-yyyy CET/PST
(2 часа назад).
Это 2 часа назад должно рассчитываться с локального времени пользователя. Точно так же, как вопрос, созданный/отредактированный, с отображением часового пояса и расчетами локальных пользователей.
Пример: answered Jan 25 '13 at 17:49 CST (6 hours/days/month ago)
Таким образом, другой просмотр пользователя из США/Индии может действительно понять, что эта запись была создана ровно через 6 часов с текущего времени в Индии/США
Почти я думаю, что я достиг всего, кроме формата отображения и расчета. Как я могу это сделать?