2017-01-19 19 views
-1

GMTの時間マッチングがC#MVCで動作しません。GMTの時間マッチングがC#で動作しないmvcが動作しない

時間差を取得する問題は正しくありません。

DateTime newDateTime = Convert.ToDateTime(DateNw).Add(TimeSpan.Parse(Time)); 
////New Zealand 
string nzTimeZoneKey = Country + " Standard Time"; 
string date = newDateTime.ToUniversalTime().ToString("u"); 
DateTime localDateTime = DateTime.Parse(date); 
DateTime utcDateTime = localDateTime.ToUniversalTime(); 
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey); 
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone); 
return nzDateTime; 

上記のコードは非常によく働いたが、私はインド、フィジーとの間に国を変更した場合、それが動作していないインド、アフガニスタンのために働いて:ここで

私がしようとしたが、働いていないですコードです。

2カ国の時間を区別できるすべての国でGMTタイムマッチングが必要です。 提案がありますか?

+2

なぜ、 'string'に普遍的な時間を書いて、それを' DateTime'に解析するのですか?具体的に 'utcDateTime'は' newDateTime.ToUniversalTime() 'と同じではないでしょうか? – juharr

+0

このコードはインディアン対フィジーtime.couldのために働いていない私のためのコードを書き留めて –

+2

This - > Country + "Standard Time";動作しないでしょう。タイムゾーン情報を見つけるための特定の名前/キーがあります。あなたがやっているやり方で文字通りに国を追いつくことはできません。あなたがテストしている世界の領域にあるタイムゾーン名を見つける必要があります。 –

答えて

2

TimeZoneInfo conversionscでCountry + "Standard Time"として使用する適切なタイムゾーン名を見つけるには、レジストリを調べる必要があります。

キーHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zonesには、サポートされているすべてのタイムゾーンの名前が含まれています。マイクロソフトはフィジーが最近DSTを変更したという情報をリリースしたことに注意してください。

これを過度に複製していますか?

string date = newDateTime.ToUniversalTime().ToString("u"); 
DateTime localDateTime = DateTime.Parse(date); 

これが動作するかどうかを参照してください... DateTimeはUTCで保存されている場合は、私は以下の静的クラスに追加いくつかの機能を使用することができ

。ここで

DateTime utcDateTime=ReadeFromDatabaseAsUTC(); 

    TimeZoneInfo localTimeZoneInfo=new TimeZoneInfo("New Zealand Standard Time"); 
    DateTime localDateTime= TimeZoneConversion.FromUTCToSpecificTimeZone(localTimeZoneInfo,utcDateTime);  
    localDateTime=localDateTime.Add(TimeSpan.Parse(Time)); 
    utcDateTime=TimeZoneConversion.FromSpecificTimeZoneToUTC(localTimeZoneInfo,localDateTime); 

    SaveToDatabaseAsUTC(utcDateTime); 

は、コンバージョンを支援するために使用できる便利なクラスです:

public static class TimeZoneConversion 
{ 
    public static System.DateTime FromSpecificTimeZoneToUTC(string specificZone, System.DateTime specificTimeZoneDateTime) 
    { 
     TimeZoneInfo fromZone = TimeZoneInfo.FindSystemTimeZoneById(specificZone); 
     return TimeZoneInfo.ConvertTimeToUtc(specificTimeZoneDateTime, fromZone); 
    } 
    //-------------------------------------------------------------------------------------------- 
    public static System.DateTime FromSpecificTimeZoneToUTC(TimeZoneInfo fromZone, System.DateTime specificTimeZoneDateTime) 
    { 
     System.DateTime temp = System.DateTime.SpecifyKind(specificTimeZoneDateTime, DateTimeKind.Unspecified); 
     return TimeZoneInfo.ConvertTimeToUtc(temp, fromZone); 
    } 
    //-------------------------------------------------------------------------------------------- 
    public static System.DateTime FromUTCToSpecificTimeZone(TimeZoneInfo toZone, System.DateTime UTCTimeZoneDateTime) 
    { 
     return TimeZoneInfo.ConvertTimeFromUtc(UTCTimeZoneDateTime, toZone); 
    } 
    //-------------------------------------------------------------------------------------------- 
    public static TimeSpan GetTimeZoneOffsetDifference(TimeZoneInfo oldZone, TimeZoneInfo newZone) 
    { 
     var now = DateTimeOffset.UtcNow; 
     TimeSpan oldOffset = oldZone.GetUtcOffset(now); 
     TimeSpan newOffset = newZone.GetUtcOffset(now); 
     TimeSpan difference = oldOffset - newOffset; 
     return difference; 
    } 
    //-------------------------------------------------------------------------------------------- 
    public static System.DateTime FromUTCToSpecificTimeZone(string totimezone, System.DateTime UTCTimeZoneDateTime) 
    { 
     TimeZoneInfo toZone = TimeZoneInfo.FindSystemTimeZoneById(totimezone); 
     return TimeZoneInfo.ConvertTimeFromUtc(UTCTimeZoneDateTime, toZone); 
    } 
    //-------------------------------------------------------------------------------------------- 
    public static System.DateTime FromLocalTimeZoneToUTC(System.DateTime localDateTime) 
    { 
     return localDateTime.ToUniversalTime(); 
    } 
    //-------------------------------------------------------------------------------------------- 
    public static string GetServerTimeZoneID() 
    { 
     return TimeZone localZone = TimeZone.CurrentTimeZone.StandardName; 
    } 
    //-------------------------------------------------------------------------------------------- 

} 
1

私は単に代わりに国を変えるのタイムゾーンに基づいて、それぞれの現在の時刻を設定することをお勧め:

var tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
var localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi); 

なり、各動作しないためにこれをやって? それぞれを直接接続する必要はありません。

+0

var tzi = TimeZoneInfo.FindSystemTimeZoneById( "フィジー標準時"); var localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow、tzi);このコードは機能していません。フィジーはインド時間から6:30時間先です。間違っています。 –

+0

あなたのコードは動作していません。より多くの提案 –

+0

あなたはあなたのTimeZone情報のために結婚していますか? 「インド標準時」を使用すると問題はありません。 – Monolithcode

1

あなたは代わりに国の名前に基づいて作成しようとしているの標準タイムゾーンを使用する必要があります。

ReadOnlyCollection<TimeZoneInfo> tzCollection; 
tzCollection = TimeZoneInfo.GetSystemTimeZones(); 

Console.WriteLine(tzCollection.Count); 
foreach (TimeZoneInfo timeZone in tzCollection) 
{ 
    Console.WriteLine("{0} : {1} : {2}", timeZone.Id, timeZone.DisplayName, timeZone.BaseUtcOffset.TotalMinutes); 
} 

このタイムゾーンコレクションは、リストまたはドロップダウンリストにバインドできます。 DisplayNameを使用すると、ユーザー名とIDをリスト内の各項目にバインドされた値として表示できます。ユーザーがタイムゾーンを選択すると、そのタイムゾーンをそのIDを使用してコレクションから見つけることができます。

var selectedTimezone = DropDownList1.SelectedItem.Value; 
TimeZoneInfo.FindSystemTimeZoneById(selectedTimeZone); 

時間の情報があれば、変換などのロジックを引き継ぐことができます。

関連する問題