DST(夏時間)が有効になっているかどうか、および有効になっている場合はオフセットを確認するにはどうすればよいですか?


154

これはこれが必要な私のJSコードのビットです:

var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);

「前」の日時を取得したいのですが、夏時間を使用している場合、日付は1時間ずれます。DSTが有効かどうかを確認する方法がわかりません。

サマータイムの開始と終了を知るにはどうすればよいですか?

回答:


313

このコードは、標準時と夏時間(DST)の間に大きな値をgetTimezoneOffset返すという事実を使用しています。したがって、標準時の予想出力を決定し、指定された日付の出力が同じ(標準)か、それより少ない(DST)かを比較します。

は、UTCの西側のゾーンに対しての分数をgetTimezoneOffset返すことに注意してください。これらは通常、負の時間として示されます(UTCの「背後」にあるため)。たとえば、ロサンゼルスは UTC–8h標準、UTC-7h DSTです。ではなく、12月(冬、標準時)に(正の480分)をgetTimezoneOffset返します。東半球では負の数値を返します(これは「先行」しているにもかかわらず(UTC + 10h)、冬のシドニーではそうです)。480-480-600

Date.prototype.stdTimezoneOffset = function () {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}

Date.prototype.isDstObserved = function () {
    return this.getTimezoneOffset() < this.stdTimezoneOffset();
}

var today = new Date();
if (today.isDstObserved()) { 
    alert ("Daylight saving time!");
}

28
これが国際的に機能することを確認できます。現在、1月1日と7月1日の両方がDST期間に含まれるか、両方ともDST期間から外れる、DSTの任意の形式を使用するタイムゾーンはありません。また、TZDB内のすべてのタイムゾーン(1つの自明な例外を除く)では、2つのオフセットのうち大きい方がDSTオフセットです。JavaScript getTimezoneOffsetは逆の値を返すため、Math.max実際には標準のオフセットを返します。コードは正しいです。
Matt Johnson-Pint 2013

7
ただし、1月1日と7月1日の両方がDSTに含まれるか、どちらもDSTに含まない(そしてDSTが引き続き適用される)ようにタイムゾーンの定義が変更された場合、このコードはそのゾーンでは機能しません。
Matt Johnson-Pint 2013

9
これは一般的には機能しません。たとえば、特定の年にDSTを観察していない国や、ラマダン中にDSTを元に戻す国もあります。次に、DateのECMAScript定義が壊れており、一部の実装ではTZ環境変数の処理も壊れています。このすべてを組み合わせると、このメソッドは信頼できなくなります。Dateを使用しないライブラリを使用するほうがよいです。例:timezonecomplete
rogierschouten

5
このコードは、南アフリカやアイスランドなど、DSTを遵守していない国では機能しません。これを使用してそれらの国の他のタイムゾーンと比較すると、正しい時刻が表示されません。UTCを最後まで使用することを提案し、現在の時刻が特定のDSTの範囲内にあるかどうかを手動で確認します。次に、通常時間のUTCオフセットを+1変更してDSTを取得するだけです。
Kebman、2015年

1
これはどのようにして正しいのでしょうか?たとえば、ドイツは2016-10-30に夏時間に入り、アメリカは1週間後の2016-11-06に入りました。このような悪い情報は、このようなことが起こる原因です: macworld.co.uk/news/apple/...
ダニエル・F

22

6つの日付と1月の日付の2つの日付を作成します。それらのgetTimezoneOffset()値を比較します。

  • 1月のオフセット> 6月のオフセットの場合、クライアントは北半球にいます
  • 1月のオフセット<6月のオフセットの場合、クライアントは南半球にいます
  • 違いがない場合、クライアントのタイムゾーンはDSTを監視しません

次に、現在の日付のgetTimezoneOffset()を確認します。

  • 北半球の6月に等しい場合、現在のタイムゾーンはDST(+1時間)です。
  • 1月の南半球に等しい場合、現在のタイムゾーンはDST(+1時間)です。

なぜ半球が必要なのですか?現在の日付のgetTimezoneOffset()が2つのgetTimezoneOffset()のうち小さい方と等しい場合、そのDSTと言っても十分ではないでしょうか。[そして、オフセットは2つの間の違いですか?]
epeleg '

受け入れられた回答が明確に示すように、半球は必要ありません:)
Jon Nylander 14年

これは機能しません。最善の方法は、UTC時間を使用し、目的の領域のオフセットを手動で設定することです。次に、同じ領域のDSTの開始と終了を手動で見つけます(ある場合)。次に、その地域の時間が夏時間の範囲内かどうかを確認し、それに応じてオフセットを+1で更新します。これにより、夏時間を遵守している国と遵守していない国を比較することができます。
Kebman

問題は、DSTがクライアントマシンKebmanのタイムゾーンで現時点で有効かどうかを判断する方法であり、日付を表示する方法ではなく、Webクライアントがすでに処理していることです。
Jon Nylander

1月から7月(または2月から8月、3月から9月など)は6か月離れているため、確認する必要があります。
kpull1

17

この回答は受け入れられた回答に非常に似ていますが、Dateプロトタイプをオーバーライドせず、夏時間の有効性を確認するために2つではなく1つの関数呼び出しのみを使用します。


考えは、7か月続くDSTを観察する国はないためです[1]、DSTを観測する地域では、1月のUTC時間からのオフセットは7月のUTC時間とは異なります。

夏時間は時計を進めます、JavaScriptは常により大きな値を返します標準時間中に値を。したがって、1月から7月の間に最小オフセットを取得すると、夏時間中にタイムゾーンオフセットが取得されます。

次に、日付のタイムゾーンがその最小値に等しいかどうかを確認します。ある場合は、DSTになります。そうでなければ私たちはそうではありません。

次の関数はこのアルゴリズムを使用しています。日付オブジェクトを受け取り、その日付の夏時間が有効かどうか、また有効でない場合dは次のtrueように返しますfalse

function isDST(d) {
    let jan = new Date(d.getFullYear(), 0, 1).getTimezoneOffset();
    let jul = new Date(d.getFullYear(), 6, 1).getTimezoneOffset();
    return Math.max(jan, jul) != d.getTimezoneOffset(); 
}

1
これは機能しますが、現在のTimeZoneにDSTがない場合は、結果もtrueになりますが、これは正しくありません。これをに切り替えるとMath.max(...) != d.get...()、指定されたタイムゾーンでDSTが観測され、日付が現在DSTにある場合に、trueが返されます。DSTが監視されない場合、または日付が標準オフセットと一致する場合は、falseが返されます。
GreySage

12

今日も同じ問題に直面していましたが、夏時間は米国とは異なる時間に開始および終了するため(少なくとも私の理解では)、少し異なるルートを使用しました。

var arr = [];
for (var i = 0; i < 365; i++) {
 var d = new Date();
 d.setDate(i);
 newoffset = d.getTimezoneOffset();
 arr.push(newoffset);
}
DST = Math.min.apply(null, arr);
nonDST = Math.max.apply(null, arr);

次に、現在のタイムゾーンオフセットをDSTおよびnonDSTと比較して、どれが一致するかを確認します。


これも私たちが行う方法です。つまり、ターゲットタイムゾーンでDSTが変更される年間の時間を把握し、現在の日付と最新の変更日のオフセットを計算します。それらは1時間異なるか、または等しくなります(問題のタイムゾーンが1時間のオフセットであると想定)。
ヘザー

365の値を作成する必要はありません。夏時間調整が行われていない場合でも、オフセットの変更が決定されるとすぐに停止するバイナリ検索アプローチは非常に効率的です。これらのアプローチはすべて、場所が毎年夏時間を遵守することを前提としていますが、必ずしもそうであるとは限りません。場所は時々夏時間を採用および放棄します(ただし、ECMAScriptは、その地域に関係なく、常に適用される現在のルールを前提としています)。
RobG 2014年

2
Rob-

9

Sheldon Griffinによって提供されたソリューションに関するMatt Johansonのコメントに基づいて、次のコードを作成しました。

    Date.prototype.stdTimezoneOffset = function() {
        var fy=this.getFullYear();
        if (!Date.prototype.stdTimezoneOffset.cache.hasOwnProperty(fy)) {

            var maxOffset = new Date(fy, 0, 1).getTimezoneOffset();
            var monthsTestOrder=[6,7,5,8,4,9,3,10,2,11,1];

            for(var mi=0;mi<12;mi++) {
                var offset=new Date(fy, monthsTestOrder[mi], 1).getTimezoneOffset();
                if (offset!=maxOffset) { 
                    maxOffset=Math.max(maxOffset,offset);
                    break;
                }
            }
            Date.prototype.stdTimezoneOffset.cache[fy]=maxOffset;
        }
        return Date.prototype.stdTimezoneOffset.cache[fy];
    };

    Date.prototype.stdTimezoneOffset.cache={};

    Date.prototype.isDST = function() {
        return this.getTimezoneOffset() < this.stdTimezoneOffset(); 
    };

すべてのコメントと以前に提案された回答、特にそれを考慮に入れて、すべての世界で最高のものを得ようとします:

1)年間stdTimezoneOffsetの結果をキャッシュするため、同じ年に複数の日付をテストするときに再計算する必要がありません。

2)DST(存在する場合)が必ずしも7月であるとは想定されておらず、いつの時点でも、どこかの場所が月になっても機能する。ただし、パフォーマンスに関しては、7月(または数か月近く)が実際にDSTである場合は、より速く機能します。

3)最悪の場合、毎月1日のgetTimezoneOffsetを比較します。[そしてテストされた年に一度それを行う]。

それでも、DST期間がある場合は1か月よりも大きいという前提で行われます。

誰かがその仮定を削除したい場合、彼はループをアーロンコールによって提供されたソルティンのようなものに変更できます-しかし、私はまだ半年先にジャンプし、2つの異なるオフセットが見つかったときにループから抜け出します。


4

moment.jsライブラリが提供して.isDst()その時刻オブジェクトのメソッドを。

moment#isDSTは、現在の時刻が夏時間かどうかを確認します。

moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST

私はvar moment = require( 'moment');を試しました。this.logger.info(moment([2011、2、12])。isDST()); this.logger.info(moment([2011、2、14])。isDST()); どちらも偽
Logan_B

DSTの変更日は、同じ国の州(アリゾナ州など)でも、によって異なります。アメリカでは2011-03-13でしたが、ドイツでは2011-03-31でした。結果はで動作するように構成されているタイムゾーンmoment.jsによって異なりますので。
ダニエル・F

1
アリゾナ州内でも変動しますtimeanddate.com/time/us/arizona-no-dst.html
ダニエルF

3

getTimezoneOffset()ブラウザのJavaScript のメソッドは、00:00タイムゾーンからのオフセットの分数を返します。たとえば、夏時間(DST)のAmerica / New_Yorkタイムゾーンは数値300を返します。300分はゼロから5時間の差です。300分を60分で割ると5時間になります。すべてのタイムゾーンはゼロタイムゾーンと比較されます(+00:00 / Etc / GMT /グリニッジ標準時)。

MDN Webドキュメント

次に知っておく必要があるのは、オフセットには実際のタイムゾーンとは反対の符号があるということです。

タイムゾーンに関する情報は、Internet Assigned Numbers Authority(iana)によって管理されています

アナのタイムゾーン

タイムゾーンのきれいにフォーマットされた表はjoda.orgから提供されています

jodaタイムタイムゾーン

+00:00またはEtc / GMTはグリニッジ標準時です

すべてのタイムゾーンは+00:00 / "Etc / GMT" /グリニッジ標準時からオフセットされています

夏時間は常に夏の「通常の」時間より早い時間です。秋のシーズンに時計を戻します。(何をすべきかを思い出すための「フォールバック」スローガン)

したがって、夏時間(冬)のアメリカ/ニューヨーク時間は通常時間の1時間前になります。たとえば、通常、夏のニューヨーク市の午後5時だったものは、夏時間のアメリカ/ニューヨーク時間で午後4時になります。「America / New_York」という名前は、「Long Format」タイムゾーン名です。米国の東海岸は通常、タイムゾーンを東部標準時(EST)と呼んでいます。

今日のタイムゾーンオフセットを他の日付のタイムゾーンオフセットと比較する場合は、タイムゾーンオフセットの数学記号(+/- "正/負")がタイムゾーンの反対であることを知る必要があります。

joda.orgのタイムゾーンテーブルを見て、 "America / New_York"のタイムゾーンを見つけます。標準オフセットの前に負の符号があります。

地球はその軸を中心に反時計回りに回転します。グリニッジで日の出を見る人は、ニューヨーク市の誰かが日の出を見る5時間前に日の出を見ます。そして、米国の東海岸にいる誰かが日の出を見た後に、米国の西海岸にいる誰かが日の出を見るでしょう。

これをすべて知る必要があるのには理由があります。そのため、1年の異なる時間にすべてのタイムゾーンをテストする必要なく、一部のJavaScriptコードがDSTステータスを正しく取得しているかどうかを論理的に判断できるようになります。

ニューヨーク市が11月で、時計が1時間遅れているとします。ニューヨーク市の夏のオフセットは240分または4時間です。

これをテストするには、7月の日付を作成し、オフセットを取得します。

var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();

console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)

ブラウザーの開発者ツールコンソールログには何が出力されますか?

正解は240です。

これで、1月に日付を作成し、冬季のタイムゾーンオフセットに対してブラウザーが返す結果を確認できます。

var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();

console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)

答えは:300

明らかに300は240よりも大きいのです。つまり、これはどういう意味ですか?冬のオフセットが夏のオフセットよりも大きいかどうかをテストするコードを記述する必要がありますか?または夏のオフセットは冬のオフセットよりも少ないですか?夏時間帯と冬時間帯のオフセットに差がある場合は、この時間帯にDSTが使用されていると想定できます。しかし、それはあなたに伝えません今日がブラウザーのタイムゾーンにDSTを使用しはわかり。したがって、今日のタイムゾーンオフセットを取得する必要があります。

var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();

console.log('todaysTimeZone : ' + todaysTimeZone)

答えは:?-時期によって異なります

今日のタイムゾーンオフセットと夏のタイムゾーンオフセットが同じ場合、 夏と冬のタイムゾーンオフセットは異なっている、そして論理的控除で、今日はDSTにはないしなければなりません。

夏と冬のタイムゾーンオフセットの比較(このタイムゾーンにDSTが使用されているかどうかを知るため)を省略して、今日のタイムゾーンオフセットを夏のTZオフセットと比較するだけで、常に正しい答えを得ることができますか?

today's TZ Offset !== Summer TZ Offset

さて、今日は冬ですか、夏ですか?それを知っていれば、次のロジックを適用できます。

if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
  var are_We_In_DST = true;
}

しかし問題は、今日の日付が冬か夏かが分からないことです。すべてのタイムゾーンには、DSTの開始と停止のタイミングに関する独自のルールを設定できます。世界のすべてのタイムゾーンについて、すべてのタイムゾーンのルールを追跡する必要があります。したがって、より良い簡単な方法がある場合は、より簡単な方法で行うこともできます。

残っているのは、このタイムゾーンがDSTを使用しているかどうかを確認し、今日のタイムゾーンオフセットと夏のタイムゾーンオフセットを比較する必要があるということです。それは常にあなたに信頼できる答えを与えるでしょう。

最終的なロジックは次のとおりです。

if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
  var are_We_In_DST = true;
}

ブラウザのタイムゾーンがDSTを使用しているかどうかを判別する関数:

function is_DST_Used_In_This_TimeZone() {
  var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet 
      offsetsNotEqual, thisYear, today;

  today = new Date();//Create a date object that is now
  thisYear = today.getFullYear();//Get the year as a number

  Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
  jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();

  console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)

  July_Date = new Date(thisYear, 6, 1);
  july_Timezone_OffSet = July_Date.getTimezoneOffset();

  console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)

  offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal

  console.log('offsetsNotEqual: ' + offsetsNotEqual);

  return offsetsNotEqual;//If the offsets are not equal for summer and
       //winter then the only possible reason is that DST is used for
       //this time zone
}

1
dateandtime.comによると、 DSTは2019年3月10日に始まったため、冬ではなく夏になり、ニューヨークのDSTオフセットは-5ではなく-4です。
jk7

回答を改善または修正する必要がある場合は、編集してください。レビューされます。
アランウェルズ

2

Moment.js(https://momentjs.com/)を

moment().isDST(); 日光の節約が観察された場合にあなたを与えるでしょう。

また、それはあなたのために相対的な時間を計算するヘルパー機能を持っています。手動で計算する必要はありません。moment("20200105", "YYYYMMDD").fromNow();


1

あなたは近くにいますが、少し離れています。それはあなた自身の時計の結果なので、あなたはあなた自身の時間を計算する必要はありません。あなたの場所で夏時間を使用しているかどうかを検出できますが、オフセットによって生成されたリモートの場所については検出できません。

newDateWithOffset = new Date(utc + (3600000*(offset)));

彼らがDSTにいる場合、これはまだ間違っており、1時間オフになります。それらが現在DST内にあるかどうかに関係なく、リモートタイムアカウントが必要であり、それに応じて調整します。これを計算して、時計を次のように変更してください。2015年2月1日と言って、夏時間外と同じように時計を1時間戻します。次に、まだ2時間遅れているはずの場所のオフセットを計算します。2時間枠より1時間早く表示されます。それでも、時間を考慮して調整する必要があります。私はニューヨークとデンバーのためにそれをやった、そしてデンバーではいつも間違った(時間先)に行きます。


1

ここで説明されているいくつかの概念(1月と6月を比較)でMoment.jsライブラリを使用すると、非常にうまく機能することがわかりました。

この単純な関数は、ユーザーがいるタイムゾーンが夏時間を遵守しているかどうかを返します。

function HasDST() {
    return moment([2017, 1, 1]).isDST() != moment([2017, 6, 1]).isDST();
}

これが機能することを確認する簡単な方法(Windows)は、タイムゾーンを非DSTゾーンに変更することです。たとえば、アリゾナはfalseを返しますが、ESTまたはPSTはtrueを返します。

ここに画像の説明を入力してください


1

すべてのタイムゾーンで機能する将来性のあるソリューション

  1. ましょうx夏時間におけるファクタリングなしに関心の年にミリ秒数の期待値とします。
  2. してみましょうyからのミリ秒数でエポック関心の日付の年の開始から。
  3. させるzからのミリ秒数でエポック関心の完全な日付と時刻の
  4. t両方xyからの減算をしましょうzz - y - x。これにより、DSTによるオフセットが生じます。
  5. 場合はtゼロで、その後、DSTは有効ではありません。場合はtゼロではない、その後、DSTが有効です。

(function(){"use strict";
function dstOffsetAtDate(dateInput) {
    var fullYear = dateInput.getFullYear()|0;
	// "Leap Years are any year that can be exactly divided by 4 (2012, 2016, etc)
 	//   except if it can be exactly divided by 100, then it isn't (2100,2200,etc)
 	//	  except if it can be exactly divided by 400, then it is (2000, 2400)"
	// (https://www.mathsisfun.com/leap-years.html).
    var isLeapYear = ((fullYear & 3) | (fullYear/100 & 3)) === 0 ? 1 : 0;
	// (fullYear & 3) = (fullYear % 4), but faster
    //Alternative:var isLeapYear=(new Date(currentYear,1,29,12)).getDate()===29?1:0
    var fullMonth = dateInput.getMonth()|0;
    return (
        // 1. We know what the time since the Epoch really is
        (+dateInput) // same as the dateInput.getTime() method
        // 2. We know what the time since the Epoch at the start of the year is
        - (+new Date(fullYear, 0, 0)) // day defaults to 1 if not explicitly zeroed
        // 3. Now, subtract what we would expect the time to be if daylight savings
        //      did not exist. This yields the time-offset due to daylight savings.
        - ((
            ((
                // Calculate the day of the year in the Gregorian calendar
                // The code below works based upon the facts of signed right shifts
                //    • (x) >> n: shifts n and fills in the n highest bits with 0s 
                //    • (-x) >> n: shifts n and fills in the n highest bits with 1s
                // (This assumes that x is a positive integer)
                (31 & ((-fullMonth) >> 4)) + // January // (-11)>>4 = -1
                ((28 + isLeapYear) & ((1-fullMonth) >> 4)) + // February
                (31 & ((2-fullMonth) >> 4)) + // March
                (30 & ((3-fullMonth) >> 4)) + // April
                (31 & ((4-fullMonth) >> 4)) + // May
                (30 & ((5-fullMonth) >> 4)) + // June
                (31 & ((6-fullMonth) >> 4)) + // July
                (31 & ((7-fullMonth) >> 4)) + // August
                (30 & ((8-fullMonth) >> 4)) + // September
                (31 & ((9-fullMonth) >> 4)) + // October
                (30 & ((10-fullMonth) >> 4)) + // November
                // There are no months past December: the year rolls into the next.
                // Thus, fullMonth is 0-based, so it will never be 12 in Javascript
                
                (dateInput.getDate()|0) // get day of the month
				
            )&0xffff) * 24 * 60 // 24 hours in a day, 60 minutes in an hour
            + (dateInput.getHours()&0xff) * 60 // 60 minutes in an hour
            + (dateInput.getMinutes()&0xff)
        )|0) * 60 * 1000 // 60 seconds in a minute * 1000 milliseconds in a second
        - (dateInput.getSeconds()&0xff) * 1000 // 1000 milliseconds in a second
        - dateInput.getMilliseconds()
    );
}

// Demonstration:
var date = new Date(2100, 0, 1)
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
    console.log(date.getMonth()+":\t"+dstOffsetAtDate(date)/60/60/1000+"h\t"+date);
date = new Date(1900, 0, 1);
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
    console.log(date.getMonth()+":\t"+dstOffsetAtDate(date)/60/60/1000+"h\t"+date);

// Performance Benchmark:
console.time("Speed of processing 16384 dates");
for (var i=0,month=date.getMonth()|0; i<16384; i=i+1|0)
    date.setMonth(month=month+1+(dstOffsetAtDate(date)|0)|0);
console.timeEnd("Speed of processing 16384 dates");
})();

上記のコードスニペットは、さまざまな理由から、ここに掲載されている他のすべての回答よりも優れていると思います。

  • この回答は、南極大陸/ケーシーを含むすべてのタイムゾーンで機能します。
  • 夏時間は変更される可能性があります。今から20年後、一部の国では通常の2ではなく3つのDST期間が存在する可能性があります。このコードは、DSTが有効か無効かだけでなく、ミリ秒単位でDSTオフセットを返すことでそのケースを処理します。
  • 年間の月のサイズとうるう年の働き方は、太陽に順応するために私たちの時間を完全に適合させます。一体、それは完璧に機能するので、私たちがやっていることは、ほんの数秒をあちこち調整するだけです。現在のうるう年のシステムは、1582年2月24日から有効であり、近い将来も有効であると思われます。
  • このコードは、DSTを使用しないタイムゾーンで機能します。
  • このコードは、DSTが実装された(1900年代など)以前の歴史的な時代に機能します。
  • このコードは最大限に整数に最適化されており、タイトなループで呼び出されても問題はありません。上記のコードスニペットを実行した後、出力の一番下までスクロールして、パフォーマンスベンチマークを確認します。私のコンピュータはChromeで16384の日付を約97ミリ秒で処理できます。

ただし、2つを超えるDST期間を準備していない場合は、以下のコードを使用して、DSTがブール値として有効かどうかを判断できます。

function isDaylightSavingsInEffect(dateInput) {
    // To satisfy the original question
    return dstOffsetAtDate(dateInput) !== 0;
}

0

最近、UTCとDSTを使用して日付文字列を作成する必要があり、シェルドンの回答に基づいてこれをまとめました。

Date.prototype.getTimezone = function(showDST) {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);

    var utcOffset = new Date().getTimezoneOffset() / 60 * -1;
    var dstOffset = (jan.getTimezoneOffset() - jul.getTimezoneOffset()) / 60;

    var utc = "UTC" + utcOffset.getSign() + (utcOffset * 100).preFixed(1000);
    var dst = "DST" + dstOffset.getSign() + (dstOffset * 100).preFixed(1000);

    if (showDST) {
        return utc + " (" + dst + ")";
    }

    return utc;
}
Number.prototype.preFixed = function (preCeiling) {
    var num = parseInt(this, 10);
    if (preCeiling && num < preCeiling) {
        num = Math.abs(num);
        var numLength		 = num.toString().length;
        var preCeilingLength = preCeiling.toString().length;
        var preOffset		 = preCeilingLength - numLength;
        for (var i = 0; i < preOffset; i++) {
            num = "0" + num;
        }
    }
    return num;
}
Number.prototype.getSign = function () {
    var num	 = parseInt(this, 10);
    var sign = "+";
    if (num < 0) {
        sign = "-";
    }
    return sign;
}

document.body.innerHTML += new Date().getTimezone() + "<br>";
document.body.innerHTML += new Date().getTimezone(true);
<p>Output for Turkey (UTC+0200) and currently in DST: &nbsp; UTC+0300 (DST+0100)</p>
<hr>


0

を使用して問題がありますか Date.toString().indexOf('Daylight Time') > -1

"" + new Date()

1月01日(土)100050 00:00:00 GMT-0500(東部標準時

"" + new Date(...)

5月1日(日)100033 00:00:00 GMT-0400(東部夏時間

これはすべてのブラウザと互換性があるようです。


はい、それは世界中で機能しません。ヨーロッパの夏には、"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
Tadej Krevh

0

ES6スタイル

Math.min(...[0, 6].map(v => new Date(95, v, 1).getTimezoneOffset() * -1));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.