日本のサマータイムにあたる時間の処理について

日本でもかつてはサマータイムが導入されていた時期がありました

1948/05/02
1949/04/03
1950/05/07
1951/05/06

Wikipedia夏時刻法
https://ja.wikipedia.org/wiki/%E5%A4%8F%E6%99%82%E5%88%BB%E6%B3%95

いずれもかなり過去の日付ですが、上記の日付の00:00:00~00:59:59は存在せず、その日は01:00:00から始まります。

ColdFusionが使用するJavaでも、2018年4月以降にリリースされたJava1.8.0_171やJava 10.0.1以降から日本のサマータイムが考慮されるようになりました

さらに、ColdFusion側でも従来はcreateDateTime関数などで日付時刻オブジェクトを生成する際には「日付」のみを対象としていましたが、ColdFusion 2021以降は「日付+時間」も処理に含まれるようになりました。

そのためcreateDataTime関数を使用して日時オブジェクトを生成しようとした際に、日付しか渡さなかった場合は、内部で00:00:00を含んで処理が実行されるため、日本では存在しなかった上記の4日を渡した場合は、Java側での例外を取得し、エラーとなります。

また、上記に記載されているサマータイム日は1:00:00から始まるため、dateAdd関数などを使って、日付時間を計算した際に、上記の日は1:00から開始されます。

対象となる処理で時刻を考慮しなくてもよい(日付しか処理に使わない)のであれば、常に01:00:00をつけて処理を行います。createDateTime関数の場合は、createDateTime(year, month, day, 1)で処理するか、createDate関数を使用します(上記日付の日付時刻オブジェクトを作成すると、時間が1:00になります)。

時刻を考慮する必要がある場合は、日本では問題となるサマータイムの日付が4日に限られるため、条件文を使って上記の年月日が指定されたときは、時間を0時ではなく1時で指定するなどの処理を行ってください。

(補足)
IsDate関数に限っては、サマータイムで存在しない日時(日本ロケールの場合は上記の日付の00:00:00~00:59:59)ではエラーで処理が戻されます。こちらは日本以外の別のロケールのサマータイムで既知の不具合として登録されていますが、現時点では制限となっています。

もし、IsDate関数を使用していて、エラーが発生する場合、回避方法として、時刻を考慮する必要がない場合は、常に01:00:00となるように時間を付けてから処理を行ってください。時刻を考慮する必要がある場合は、事前にサマータイムの年月日が指定された場合の条件処理をIsDateとは別に指定するか、あるいは、下記のようにIsDateでサマータイムによってエラーが発生する箇所には例外タイプを使ってcftry~cfcatchで取得して処理を行う方法を行ってください。

 <cfset date="1948/05/02">
 <cftry>
 <cfset chkdate=IsDate(date)>
 <cfcatch type="coldfusion.util.DateUtils$InvalidDateException">
  <!--- サマータイムでエラーが発生した場合の処理を行う --->
 <cfset chkdate=true>
 </cfcatch>
 </cftry>


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.