2012-04-10 6 views
1
new Date('April 12, 2012 05:00:00 ').toLocaleString(); 

日付自体は、PHPで提供され、フォーマットされています。しかし、ユーザーがログインしていない場合は、タイムゾーンのオフセットがわからないため、JavaScriptを強制的に使用しています。JavaScriptの日付コンストラクタでユーザーのタイムゾーンを検索して消費する

オフセットを見つけて適用するには、どうすれば1行にまとめることができますか?

+1

1行のコードですべてをやらなければならないことに常に戸惑いがありますか?それは2を取る場合、それは本当に容認できない解決ですか? –

+0

idkどのようにそれを最高に説明する....私はPHPでのものを介してループを繰り返し、javascriptでそれぞれのインスタンスを通過し、私はカスタム属性内に新しい日付を格納し、その属性をeval jqueryプラグインの中に...意味がありますか? – Banning

+0

私は喜んでそれを取るコードの2行でそれを行う方法を表示することができれば...私は喜んで私は笑を殺す私は笑 – Banning

答えて

1

申し訳ありません。日付は厳しいです。

可能であれば、サーバーに日付文字列をフォーマットさせ、Webページやajax応答などでブラウザーに送信させます。

本当に本当に本当に本当に本当に本当に本当に本当に本当に、クライアントでjavascriptのクライアントでタイムゾーンの変換をしたい場合は、あなたが興味のあるタイムゾーンのルールをクライアントに送信しなければなりません。 Windowsマシンをお使いの場合は、下記のPowerShellスクリプトを使用して、タイムゾーンルールと変換機能を持つjavascriptファイルを生成します。私はサードパーティのWeb APIから日付をブラウザのタイムゾーンとは異なるタイムゾーンに変換する必要があるときにこれを使用しました。

ブラウザのタイムゾーンまたはutc以外のタイムゾーンに日付オブジェクトを取得する必要がある場合のみ、この方法にしてください。それでも、あなたの代わりに日付をフォーマットするWebサービスを考えるかもしれません。

# Serialize .Net TimeZoneInfo objects to a javascript file. 
Add-Type -AssemblyName System.Web.Extensions; 
$f = "timezoneinfo.js"; 
$ser = new-object System.Web.Script.Serialization.JavaScriptSerializer; 
$tzi = [System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time"); 

# To keep the file size reasonable, exclude timezoneinfos where this web site has no activity. 
$exclude = @("Afghanistan Standard Time", 
"Arab Standard Time", 
"Arabian Standard Time", 
"Arabic Standard Time", 
"Argentina Standard Time", 
"Atlantic Standard Time", 
"AUS Central Standard Time", 
"AUS Eastern Standard Time", 
"Azerbaijan Standard Time", 
"Azores Standard Time", 
"Bangladesh Standard Time", 
"Cape Verde Standard Time", 
"Caucasus Standard Time", 
"Cen. Australia Standard Time", 
"Central America Standard Time", 
"Central Asia Standard Time", 
"Central Brazilian Standard Time", 
"Central Europe Standard Time", 
"Central European Standard Time", 
"Central Pacific Standard Time", 
"China Standard Time", 
"Dateline Standard Time", 
"E. Africa Standard Time", 
"E. Australia Standard Time", 
"E. Europe Standard Time", 
"E. South America Standard Time", 
"Egypt Standard Time", 
"Ekaterinburg Standard Time", 
"Fiji Standard Time", 
"FLE Standard Time", 
"Georgian Standard Time", 
"Greenland Standard Time", 
"Greenwich Standard Time", 
"Hawaiian Standard Time", 
"India Standard Time", 
"Iran Standard Time", 
"Israel Standard Time", 
"Jordan Standard Time", 
"Kaliningrad Standard Time", 
"Kamchatka Standard Time", 
"Korea Standard Time", 
"Magadan Standard Time", 
"Mauritius Standard Time", 
"Mid-Atlantic Standard Time", 
"Middle East Standard Time", 
"Montevideo Standard Time", 
"Morocco Standard Time", 
"Myanmar Standard Time", 
"N. Central Asia Standard Time", 
"Namibia Standard Time", 
"Nepal Standard Time", 
"Newfoundland Standard Time", 
"North Asia East Standard Time", 
"North Asia Standard Time", 
"Pacific SA Standard Time", 
"Pakistan Standard Time", 
"Paraguay Standard Time", 
"Romance Standard Time", 
"Russian Standard Time", 
"SA Eastern Standard Time", 
"SA Pacific Standard Time", 
"SA Western Standard Time", 
"Samoa Standard Time", 
"SE Asia Standard Time", 
"Singapore Standard Time", 
"Sri Lanka Standard Time", 
"Syria Standard Time", 
"Taipei Standard Time", 
"Tasmania Standard Time", 
"Tokyo Standard Time", 
"Tonga Standard Time", 
"Turkey Standard Time", 
"Ulaanbaatar Standard Time", 
"Venezuela Standard Time", 
"Vladivostok Standard Time", 
"W. Australia Standard Time", 
"W. Central Africa Standard Time", 
"W. Europe Standard Time", 
"West Asia Standard Time", 
"West Pacific Standard Time", 
"Yakutsk Standard Time"); 

"/*This file was generated by a tool*/" | out-file $f; 
"(function (TimeZoneInfo, undefined) {" | out-file $f -Append; 

$first = $true; 
"var infos = {" | out-file $f -Append; 
[System.TimeZoneInfo]::GetSystemTimeZones() | ? { 
    $exclude -notcontains $_.Id} | % { 

    # Serizliae the TimeZoneInfo 
    $s1 = $ser.Serialize($_); 
    # Serialize the adjustment rules. Convert MS Ajax dates into JS date constructors. 
    $s2 = $ser.Serialize($_.GetAdjustmentRules()) -replace "\`"\\/Date\((?<ticks>.+?)\)\\/\`"", "new Date(`$1)"; 
    # Add the adjustment rules to the resulting JSON. 
    $s3 = $s1.Substring(0, $s1.Length - 1) + ",AdjustmentRules:" + $s2 + "}"; 
    # Add item to associative JS array. 
    $s3 = "`"" + $_.ID + "`":" + $s3; 
    if (!$first) {  
     $s3 = "," + $s3; 
     $s3 | write-host; 
    } else { 
     $first = $false;   
    } 

    # Cheesy code here. But the next few steps remove properties we don't care about to get keep the file size down. 
    # Remove strings. 
    $s3 = $s3 -replace "`"(Id|DisplayName|StandardName|DaylightName)`":`".+?`"(,)?", ""; 
    # Remove all of the TimeSpan properties except TotalMinutes. 
    $s3 = $s3 -replace "`"(Ticks|Days|Hours|Milliseconds|Minutes|Seconds|TotalDays|TotalHours|TotalMilliseconds)`":[-0-9.]+?,", ""; 
    $s3 = $s3 -replace ",`"TotalSeconds`":(-)?\d+", ""; 

    $s3 | out-file $f -Append; 
} 
"};" | out-file $f -Append; 


# Add the client function to do the conversion. This mainly comes from using reflector and looking as MSDN for IsFixedDateRule. 
$s4 = " 
// This function will shift a date the approprate number of hours to make it appear correct for the given timezoneid. 
TimeZoneInfo.ConvertTime = function(dt, tzid) { 
    if (typeof(dt) === `"undefined`" || dt == null) { return null; } 
    if (typeof(tzid) === `"undefined`" || tzid == null || tzid === `"`") { return dt; } 
    var tz = infos[tzid]; 
    if (typeof(tz) === `"undefined`") { return dt; } 

    var clientOffset = dt.getTimezoneOffset(); 

    var adj = null; 
    var j = tz.AdjustmentRules.length; 
    for (var i = 0; i < j; i++) { 
     if (tz.AdjustmentRules[i].DateStart <= dt) { 
      if (tz.AdjustmentRules[i].DateEnd >= dt) { 
       adj = tz.AdjustmentRules[i]; 
       break; 
      } 
     } 
    } 

    function GetDaysInMonth(y, m) 
    { 
     return 32 - new Date(y, m, 32).getDate(); 
    } 

    function GetTransitionDayOfMonth(t, y) { 
     var startOfWeek = t.Week * 7 - 6; 
     var firstDayOfWeek = new Date(y, t.Month - 1, 1).getDay(); 
     var transitionDay = null; 
     var changeDayOfWeek = t.DayOfWeek; 
     if (firstDayOfWeek <= changeDayOfWeek) { 
      transitionDay = startOfWeek + (changeDayOfWeek - firstDayOfWeek); 
     } else { 
      transitionDay = startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek); 
     } 
     if (transitionDay > GetDaysInMonth(y, t.Month - 1)) { 
      transitionDay -= 7; 
     } 
     return transitionDay; 
    } 

    var dstOffset = 0; 
    if (adj != null) { 
     var dstStart = adj.DaylightTransitionStart.IsFixedDateRule ? 
      new Date(dt.getFullYear(), adj.DaylightTransitionStart.Month - 1, adj.DaylightTransitionStart.Day, adj.DaylightTransitionStart.TimeOfDay.getHours()) : 
      new Date(dt.getFullYear(), adj.DaylightTransitionStart.Month - 1, GetTransitionDayOfMonth(adj.DaylightTransitionStart, dt.getFullYear()), adj.DaylightTransitionStart.TimeOfDay.getHours()); 
     var dstEnd = adj.DaylightTransitionEnd.IsFixedDateRule ? 
      new Date(dt.getFullYear(), adj.DaylightTransitionEnd.Month - 1, adj.DaylightTransitionEnd.Day, adj.DaylightTransitionEnd.TimeOfDay.getHours()) : 
      new Date(dt.getFullYear(), adj.DaylightTransitionEnd.Month - 1, GetTransitionDayOfMonth(adj.DaylightTransitionEnd, dt.getFullYear()), adj.DaylightTransitionEnd.TimeOfDay.getHours()); 
     if (dstStart <= dt && dstEnd >= dt) { 
      dstOffset = adj.DaylightDelta.TotalMinutes; 
     } 
    } 
    var dtcopy = new Date(dt.getTime()); 
    dtcopy.setMinutes(dtcopy.getMinutes() + clientOffset + tz.BaseUtcOffset.TotalMinutes + dstOffset); 
    return dtcopy; 
}; 
TimeZoneInfo.Get = function(tzid) { return infos[tzid]; }; 
"; 


$s4 | out-file $f -Append; 


"} (window.TimeZoneInfo = window.TimeZoneInfo || {}));" | out-file $f -Append; 

#//TimeZoneInfo.ConvertTime(new Date(2011,7,1,16,45), "Central Standard Time"); 
#//TimeZoneInfo.ConvertTime(new Date(2011,7,1,16,45), "Eastern Standard Time"); 
#//TimeZoneInfo.ConvertTime(new Date(2011,7,1,16,45), "South Africa Standard Time"); 
#notepad.exe $f; 
+0

idkなぜそれは非常に難しいが、javascriptには.getTimezoneOffset()関数があります。それは日付にそれを適用するために何も持っていないのですか? – Banning

+1

.getTimeZoneOffset()は、気になるタイムゾーンがブラウザのローカル時刻とutcだけの場合に必要なものです。別のタイムゾーンに移動する必要がある場合は、ブラウザに組み込まれていない機能があります。その変換を実行するためのオフセットと夏時間の規則(および夏時間規則の変更の履歴)がわかっています。 – Jamey

+0

私が必要としているのは、そのコンピュータのローカルタイムゾーンです。それから、私はGMTで準備が整ったデータをフォーマットしてフォーマットする必要があります。 – Banning

0

ユーザーのタイムゾーンを検出しようとしないでください。代わりに(秒1970年1月1日午前0時UTC)のUNIX時間の時間を渡し、そこからそれを設定します。

d = new Date(); d.setTime(the_time_value); 

これは、ブラウザのに応じて、あなたはそれに渡す時に設定日付を生成しますローカルタイムゾーン。あなたは$date->getTimestamp();

で、常に保存し、UTCで(ブラウザとサーバーとの間を含む)あなたのプログラムの周りにあなたの時間を渡し、変換に親指のルールとUNIX時間に日付/時刻を変換することができますPHPで

実用的な遅れた地方の日時です。

+0

はUTCとGMTと同じものです...私はGMTですべてを保存していると言っています...私はかなり日付の時間を遊ぶことに新しい...その楽しいが、ひどいフリッピング...私はPHPでgmdateを使用します – Banning

+0

「GMT」と「UTC」は本質的に互換性があります - http://en.wikipedia.org/wiki/GMT –

+0

GMT/UTCですべての準備ができていると言ったら今よりもっと簡単ですそれをユーザーの現地時間にフォーマットします...? – Banning

関連する問題