2009-08-13 8 views
17

タイムゾーンオフセット(分)があり、タイムゾーンを決定する必要があるシナリオがあります。私はすべてのデータが利用できないことを知っています(たとえば、オフセットが-240分のタイムゾーンがいくつかあるかもしれません)が、 "最高の推測"は受け入れられます。UTCオフセットでタイムゾーンを決定するにはどうすればよいですか?

foreach (var info in TimeZoneInfo.GetSystemTimeZones()) 
{ 
    if (info.BaseUtcOffset.TotalMinutes == timezoneOffset) 
    { 
     // do something here if this is a valid timezone 
    } 
} 

このみかんは動作しますが、私は多少私を投げている夏時間を考慮して必要があります。

私の最初のパスはこのように見えました。夏時間が有効ではなく、DSTの間に約70%正解だとき、私はユーザーが彼らのために正しい時刻を表示することができます。これは、その中で「十分に」働く

foreach (var info in TimeZoneInfo.GetSystemTimeZones()) 
{ 
    var extra = info.IsDaylightSavingTime(DateTime.Now) ? 60 : 0; 
    if (info.BaseUtcOffset.TotalMinutes + extra == timezoneOffset) 
    { 
     // do something here if this is a valid timezone 
    } 
} 

:私はこの恐ろしいハックを追加しました。それでも...これは私の眼球にひどいコードです。

これを行うより良い方法はありますか?より優雅さは良いでしょう、そして、より高い精度はまだまだ良いでしょう。

更新

技術的に私はJavascriptが日付に関して取得することができます任意の情報へのアクセスを持っています。私は "オフセット"と呼ばれる隠しフィールドを配置したページを持っています。私はDateTime()。getTimezoneOffset()でオフセットフィールドを設定するJQuery関数を持っています。私がDateTimeオブジェクトに何か役立つものは見えませんが、これはアイデアのための他の手段を開くでしょう。

+0

@Sailing柔道:Javascriptでユニバーサルタイムスタンプをローカルのものに変換できるように、私の答えにいくつかのコードを追加しました。 – Kip

答えて

16

短い回答:できません。

夏時間がかかりません。たとえば、夏のアリゾナとカリフォルニア、または冬のアリゾナとニューメキシコの違い(アリゾナはDSTを観察していないため)のみをUTCオフセットから判断する方法はありません。

また、DSTを何時に観察するかという問題もあります。たとえば、米国ではDSTが早期に開始され、ヨーロッパよりも遅く終了します。

近似は可能ですが(+/- 1時間)、ユーザーに時刻を表示する場合は、間違った時刻を表示することがあります。


更新:あなたの主な目標は、ユーザーのローカルタイムゾーンにタイムスタンプを表示することであるようなコメントから、それが見えます。それがあなたがしたいことなら、あなたはUTCのタイムスタンプとして時刻を送信して、それをJavascriptでユーザのブラウザに書き直すだけです。 Javascriptが有効になっていない場合でも、使用可能なUTCタイムスタンプが表示されます。ここに私がで使用したthis questionで出てきた関数があります。あなたのニーズに合わせてそれを微調整したいかもしれません。

//@param timestamp An ISO-8601 timestamp in the form YYYY-MM-DDTHH:MM:SS±HH:MM 
//Note: Some other valid ISO-8601 timestamps are not accepted by this function 
function parseISO8601(timestamp) 
{ 
    var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$"); 
    var matches = regex.exec(timestamp); 
    if(matches != null) 
    { 
    var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10); 
    if(matches[7] == "-") 
     offset = -offset; 

    return new Date(
     Date.UTC(
     parseInt(matches[1], 10), 
     parseInt(matches[2], 10) - 1, 
     parseInt(matches[3], 10), 
     parseInt(matches[4], 10), 
     parseInt(matches[5], 10), 
     parseInt(matches[6], 10) 
    ) - offset*60*1000 
    ); 
    } 
    return null; 
} 

私のブログでは、ユーザーのローカルタイムゾーンに解析済みのタイムスタンプを表示するために使用する関数です。再度、あなたはそれをあなたが望むフォーマットに微調整することができます。

var weekDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday", 
     "Thursday", "Friday", "Saturday"); 
var months = new Array("January", "February", "March", "April", "May", "June", 
     "July", "August", "September", "October", "November", "December"); 

function toLocalTime(date) 
{ 
    var hour = date.getHours(); 
    var ampm = (hour < 12 ? "am" : "pm"); 
    hour = (hour + 11)%12 + 1; 

    var minutes = date.getMinutes(); 
    if(minutes < 10) 
    minutes = "0" + minutes; 

    return weekDays[date.getDay()] + ", " 
     + months[date.getMonth()] + " " 
     + date.getDate()   + ", " 
     + date.getFullYear()  + " at " 
     + hour     + ":" 
     + minutes     + " " 
     + ampm; 
} 
+0

これは本当です。オフセットだけではタイムゾーンを決定するのに十分ではありません。あなたは他の情報にアクセスできますか?ユーザーにタイムゾーンを尋ねることはできますか? –

+0

@Matt:技術的に私はJavascriptが私に教えることができるものにアクセスすることができますが、クライアントが現在DSTに入っているかどうかを返すJavascript DateTimeオブジェクトには何も表示されません。 –

+0

@マット:また、私が何とか自分でそれを手に入れることができれば、この運動はユーザーに情報を気にさせようとする試みです。タイムゾーンのユーザーは絶対最後の手段です。実際に、タイムゾーンでの*ほとんどの*正確な推測は、(私の場合は)尋ねるストレートアウトよりも優れています。 –

5

DTCのため、UTCからのオフセットを知っていれば、現在のタイムゾーンを知ることができません。 DSTが有効かどうかを推測しようとしている時間の部分を見ることも考えられますが、DSTの定義が異なる管轄区では政治的な考慮が不可能になります。

1

トリッキーでは、99%の時間を修正し、もう1%を閉じることができます。非常に徹底的な実装のためにjstimezonedetectをチェックしてください。

貧弱な人のアプローチは、それぞれの可能性のある報告されたタイムゾーンオフセットを最良の推測に手動でマッピングすることです。あなたが推測しているので、それについて明示的にするかもしれません!

関連する問題