5

場所からタイムゾーン名に変換する次のコードがあります。

public TimeZoneResponse ConvertCityToTimeZoneName(string location)
{
   TimeZoneResponse response = new TimeZoneResponse();
   var plusName = location.Replace(" ", "+");
   var address = "http://maps.google.com/maps/api/geocode/json?address=" + plusName + "&sensor=false";
   var result = new System.Net.WebClient().DownloadString(address);
   var latLongResult = JsonConvert.DeserializeObject<GoogleGeoCodeResponse>(result);

   if (latLongResult.status == "OK")
   {
       var timeZoneRespontimeZoneRequest = "https://maps.googleapis.com/maps/api/timezone/json?location=" + latLongResult.results[0].geometry.location.lat + "," + latLongResult.results[0].geometry.location.lng + "&timestamp=1362209227&sensor=false";
       var timeZoneResponseString = new System.Net.WebClient().DownloadString(timeZoneRespontimeZoneRequest);
       var timeZoneResult = JsonConvert.DeserializeObject<TimeZoneResult>(timeZoneResponseString);

       if (timeZoneResult.status == "OK")
       {

           response.TimeZoneName = timeZoneResult.timeZoneName;
           response.Success = true;
           return response;
       }
   }
   return response;

}

したがって、「米国ニューヨーク」を通過すると、「東部標準時」が返されます。

次に、あるソースタイムゾーンから上記の他の取得されたタイムゾーンに時間を変換するこの2番目の関数があります。

var timeInDestTimeZone = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(sourceDate.Date, TimeZoneInfo.Local.Id, destination.TimeZoneName);

この例に出くわすまではうまく機能します。私が渡したとき:オーストラリアのメルボルン、私が戻ってきた最初の機能:オーストラリア東部夏時間

オーストラリア東部夏時間を(最後の引数として)2番目の関数に渡すと、次のエラーが返されます。

タイムゾーンID「オーストラリア東部夏時間」がローカルコンピューターで見つかりませんでした

私が間違っていることについて何か提案はありますか?2番目のグーグルマップAPI呼び出しからの応答を見ると、これらは私が返すすべてのフィールドです(例としてLAを使用):

{
 "dstOffset" : 0.0,
 "rawOffset" : -28800.0,
 "status" : "OK",
 "timeZoneId" : "America/Los_Angeles",
 "timeZoneName" : "Pacific Standard Time"
}

メルボルンを通過すると、TimeZoneIdフィールドが "" Australia/Hobart""に設定されているのがわかります。これは、タイムゾーンの計算を検討するのに適切なフィールドです。または、他の「オフセット」フィールドを確認する必要がありますか?

任意の提案をいただければ幸いです。

4

2 に答える 2

7

.NETがタイムゾーンを実装する方法が原因で、1:1変換を行うための組み込みの方法はありません。サードパーティのライブラリを使用する(または独自の変換を実装する)必要があります。


この質問は、あなたが探しているものと非常によく似た解決策を求めています。

質問者は、 Olsonタイムゾーンデータベースtzデータベース/zoneinfoデータベース/IANAタイムゾーンデータベース)を内部で使用して解決策を見つけました。質問者は、変換について少し説明しているページを参照します。


最後に、探しているまさにこの機能を実装するNodaTimeを使用できます。Jon Skeetの回答は、2011年の図書館の発展を早い段階で示しています。

ライブラリの[重要な概念]ページには、変換機能を説明する日付/タイムゾーンブロックが含まれています。


アップデート

このようなルックアップテーブルを作成する方法のを次に示します。

// Note: this version lets you work with any IDateTimeZoneSource, although as the only
// other built-in source is BclDateTimeZoneSource, that may be less useful :)
private static IDictionary<string, string> LoadTimeZoneMap(IDateTimeZoneSource source)
{
    var nodaToWindowsMap = new Dictionary<string, string>();
    foreach (var bclZone in TimeZoneInfo.GetSystemTimeZones())
    {
        var nodaId = source.MapTimeZoneId(bclZone);
        if (nodaId != null)
        {
            nodaToWindowsMap[nodaId] = bclZone.Id;
        }
    }
    return nodaToWindowsMap;
}
于 2013-03-03T19:15:38.573 に答える
1

100%?次に、標準のタイムゾーン名を使用して検証します。

http://en.wikipedia.org/wiki/List_of_tz_database_time_zones

特定のマシンでタイムゾーンが見つからない場合、保証された回避策はありません。問題が発生した理由を示すエラーメッセージをコードで作成する必要があります。

特定のシステムの所有者/管理者がこれらの設定を変更したり、新しい設定を追加したりできることを理解しています。つまり、tzデータベースにない非標準のtz名です。

于 2013-03-03T19:14:21.887 に答える