2013-05-21 9 views
15

私の最初のポスト次のとおりです。私はNodaTimeを使用して、ローカルおよびUTC(両方の方法)の間の日付/時刻を変換する簡単な方法を見つけるのに苦労していNodaTimeのコンバージョン(パート2)の仕方?

DateTime conversions using NodaTime on ASP.Net MVC 3 Razor website. How to?

現在の画像です:

  • 私は、データベース内のUTCとして保存された日付/時間を持っています。
  • これをユーザーに表示する際には、現地時間帯を考慮してそれに合わせて変換する必要があります。
  • ユーザーがフィルタとして日付/時刻を指定すると、SQLクエリに送信する前に、その日付をUTCに変換する必要があります。

私がこれまで持っている:UTCからローカルに変換する

拡張(この部分は正常に動作している):

public static DateTime UTCtoLocal(this DateTime dateTime) 
    { 
     IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb; 

     var utcTimeZone = timeZoneProvider["UTC"]; 
     var dateTimeFromDb = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond); 

     var zonedDbDateTime = utcTimeZone.AtLeniently(LocalDateTime.FromDateTime(dateTimeFromDb)); 

     var usersTimezoneId = "Europe/London"; //just an example 
     var usersTimezone = timeZoneProvider[usersTimezoneId]; 

     var usersZonedDateTime = zonedDbDateTime.WithZone(usersTimezone); 

     return usersZonedDateTime.ToDateTimeUnspecified(); 
    } 

拡張UTCに地元の後ろから変換するには(この一部は問題です):

public static DateTime LocaltoUTC(this DateTime dateTime) 
    { 
     IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb; 
     var usersTimezoneId = "Europe/London"; 
     var usersTimezone = timeZoneProvider[usersTimezoneId]; 

     var dateTimeFromDb = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond); 
     var zonedDbDateTime = usersTimezone.AtLeniently(LocalDateTime.FromDateTime(dateTimeFromDb)); 

     var utcTimezoneId = "UTC"; 
     var utcTimezone = timeZoneProvider[utcTimezoneId]; 

     var utcZonedDateTime = zonedDbDateTime.WithZone(utcTimezone); 

     return utcZonedDateTime.ToDateTimeUtc(); 
    } 

私はここで間違っていますか?

答えて

26

あなたのUTCToLocalは正直言って、必要以上に多くの作業をしているようです。

それだけで次のようになります。

// Note: the DateTime here must have a "Kind" of Utc. 
public static DateTime UTCtoLocal(this DateTime dateTime) 
{ 
    Instant instant = Instant.FromDateTimeUtc(dateTime); 
    IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb; 
    var usersTimezoneId = "Europe/London"; //just an example 
    var usersTimezone = timeZoneProvider[usersTimezoneId]; 
    var usersZonedDateTime = instant.InZone(usersTimezone); 
    return usersZonedDateTime.ToDateTimeUnspecified(); 
} 

同様に、あなたのLocalToUTCは、これらの線に沿って次のようになります。

// The DateTime here should have a "Kind" of Unspecified 
public static DateTime LocaltoUTC(this DateTime dateTime) 
{ 
    LocalDateTime localDateTime = LocalDateTime.FromDateTime(dateTime); 

    IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb; 
    var usersTimezoneId = "Europe/London"; 
    var usersTimezone = timeZoneProvider[usersTimezoneId]; 

    var zonedDbDateTime = usersTimezone.AtLeniently(localDateTime); 
    return zonedDbDateTime.ToDateTimeUtc(); 
} 

あなたは異なるタイムゾーンに変換する必要がありません:ZonedDateTimeは何を知っていますインスタントは、ToDateTimeUtcは正しいことを行います。未確認のDateTimeから変換している場合は、おそらくユーザーからのものであるため、実際にはdateTimeFromDbは存在しません。

+0

ありがとう、もう一度@Jon。これを試してみる。 NodaTimeの良い仕事に気をつけてください。 – melancia

+0

LocaltoUTCの使い方は?DateTime.ToUniversalTime()はうまくいきませんか?ありがとうございます – pajics

+2

@pajics:いいえ、それは常にシステムのタイムゾーンを使用するため、OPはユーザーのタイムゾーンを使用したいからです。 –

関連する問題