私たちのアプリケーションは、地理的に異なる場所からのユーザーを処理するように設計されています。
現在のエンド ユーザーの現地時間とタイム ゾーンが何であるかを検出できません。彼らは、ヨーロッパ/ロンドンのタイムゾーンからアクセスしても、sv-se、en-us、ta-In などの異なる文化を選択します..
米国のホスティングサーバーでホストしました。アプリケーションユーザーはNorway/Denmark/Sweden/UK/USA/India
問題はDateTime.Now
、レコードの作成日/更新日などを保存するために使用されていることです。
サーバーは米国で実行されるため、すべてのユーザーデータは米国時間として保存されます:(
SOで調査した後、すべての履歴日付をDBに保存することにしました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 ConvertUTCBasedOnCulture(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 = ConvertUTCBasedOnCulture(b.CreatedDateTime);
viewModel.Add(model);
}
return View(viewModel);
}
コードを表示
@Model.CreatedTime.ToString("dd-MMM-yyyy - HH':'mm")
注: ユーザーは、ログインする前にカルチャ/言語を変更できます。米国のサーバーで実行されるローカリゼーション ベースのアプリケーションです。
を見NODATIME
たことがありますが、別の場所でホストされている多文化 Web アプリケーションにどのように役立つか理解できませんでした。
質問
29 Dec 2013, 3:15 P.M
INDIA/USA/Anywhere` にログインしているユーザーに同じレコード作成日を表示するにはどうすればよいですか?
現在、私のロジックはConvertUTCBasedOnCulture
、文化にログインしているユーザーに基づいています。ユーザーはインド/米国のどの文化を使用してもログインできるため、これは文化に関係なく行う必要があります。
データベース列
作成時間:SMALLDATETIME
更新:試みられた解決策:
DATABASE COLUMN TYPE: DATETIMEOFFSET
UI
最後に、各リクエストで以下の 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)
したがって、USA/INDIA ユーザーからの別の視聴者は、この記録が INDIA/USA 現在時刻から正確に 6 時間で作成されたことを本当に理解できます。
表示形式と計算以外はほぼできたと思います。これどうやってするの?