日本でもサマータイムが導入されたら Domino にどのような影響があるのかを検証してみました。
2018年12月13日開催の「のの会 第10回」で使用した資料です。
サマータイム導入?【開発者編】その時 Notes/Domino は正確な時刻を刻むのか
View Slide
サマータイム?2年限定?2時間!https://www.sankei.com/politics/news/180806/plt1808060002-n1.html
前回のおさらい
Notes/Domino のサマータイム対応• サマータイムの情報(開始/終了の日時等)はタイムゾーン情報に含まれている• Notes/Domino は基本的にはOSのタイムゾーン設定に依存している• サーバーとクライアントの両方で(Windows Update等による)タイムゾーン情報の更新が必要• 既存文書の古いタイムゾーン情報を更新するツールが公開されている• サマータイムの切替日は「ServerTasksAt?=」とプログラム文書に注意せよ• 2時間進めるサマータイムに対応できるのか?
Notesのタイムゾーン
タイムゾーンと夏時間の実施状況を示す「ラベル」https://www.ibm.com/developerworks/jp/lotus/iris_today/20010301_5.html
フィールドの種類「タイムゾーン」選択肢保存される値
式言語と夏時間
タイムゾーンを扱う@関数@GetCurrentTimeZone オペレーティングシステムの現在のタイムゾーン設定を、正規のタイムゾーン形式で返します@TimeToTextInZone 日時値を文字列に変換し、このときタイムゾーン情報を取り込みます@TimeZoneToText 正規のタイムゾーン値を、読み取り可能な文字列に変換します@TimeMerge 別々に指定された日付、時刻、およびタイムゾーンの値から日時値を作成します@Zone 現在のコンピュータまたは指定された日時値のタイムゾーン設定を返し、サマータイムを実施しているかどうかを示します
【参考】正規のタイムゾーン値Z=9$DO=1$DL=4 1 1 10 -1 1$ZX=1$ZN=AlaskanZ タイムゾーンの GMT からの時差。上記はGMTの9時間後であることを示しているDO サマータイム (DST : Daylight Saving Time) 監視フラグ。1 はサマータイムが有効であることを示し、0 は無効であることを示します。1 の場合はDL に値が渡されますDL <開始月> <開始週> <開始曜日> <終了月> <終了週> <終了曜日> を特定するサマータイムのルールZX ホスト固有のタイムゾーンインデックスZN タイムゾーン名正規のタイムゾーン値には、夏時間を適用する「年」、開始/終了の「時刻」、「進める時間の長さ」を示す情報が無い
【検証】日本のタイムゾーン値を変えるZ=-9$DO=1$DL=4 1 1 10 1 1$ZX=110$ZN=Tokyo4月の第一日曜 10月の第一日曜夏時間を有効化@GetCurrentTimezone の戻り値“Z=-9$DO=0$ZX=110$ZN=Tokyo”
【検証】日本のタイムゾーン値を変える夏時間の実施状況z := "Z=-9$DO=1$DL=4 1 1 10 1 1$ZX=110$ZN=Tokyo";dt := [2018/xx/15 12:00:00];tm := @TimeMerge ( @Date( dt ); @Time( dt ); z )1時間戻る? 1時間進む開始/終了が逆?
【参考】デフォルトの切り替え時刻https://www-01.ibm.com/support/docview.wss?uid=ibm10734019Notes.ini にDSTLAWTIME が定義されていない場合夏時間は午前2時に始まり、午前1時に終わる
【検証】日本のタイムゾーン値を変える切り替え時刻z := "Z=-9$DO=1$DL=4 1 1 10 1 1$ZX=110$ZN=Tokyo";dt := [2018/04/01 01:00:00];tm := @TimeMerge ( @Date( dt ); @Time( dt ); z )開始日の4時?終了日の1時? 開始日の2時、終了日の1時
【検証】日本のタイムゾーン値を変える結果@TimeMerge + @Text• 正規のタイムゾーン値がOSのタイムゾーン値と異なる場合、想定した日時が返らない?@TimeToTextInZone• 想定した値が返る
式言語日付コーディングの癖OSのタイムゾーンを変えて検証
Designer 上で現地時刻に自動変換ZE9で保存、PSTで開くOSのタイムゾーン:ZE9 OSのタイムゾーン:PST@Text の結果はどちらも“2018/10/10 12:00:00 ZE9”
夏時間の自動変換(開始日時)OSのタイムゾーン:PST存在しない時刻を指定すると(1時59分59秒の1秒後は3時)存在する時刻へ自動変換
夏時間の自動変換(終了日時)OSのタイムゾーン:PST式 結果@Text([2018/11/04 00:59:59]; "D0T0Z2") 2018/11/04 00:59:59 PDT@Text([2018/11/04 01:00:00]; "D0T0Z2") 2018/11/04 01:00:00 PST1秒後のつもりで指定すると… (1秒後は 2018/11/04 00:00:00 PST だが)1時間と1秒後
日時はそのまま、ラベルだけ変わるdt :[email protected]( "2018/10/10 12:00:00" )OSのタイムゾーン @Text( dt; “D0T0Z2“ ) の結果ZE9 2018/10/10 12:00:00 ZE9PST 2018/10/10 12:00:00 PDT@TextToTime の値にタイムゾーンが無い場合、現在のOSのタイムゾーンが適用される。
特定の地域の日時をハードコードするならdt := @TextToTime( "2018/10/10 12:00:00 ZE9" )OSのタイムゾーン @Text( dt; “D0T0Z2“ ) の結果ZE9 2018/10/10 12:00:00 ZE9PST 2018/10/10 12:00:00 ZE9@TextToTime の値にあるラベルが現在のOSのタイムゾーンより優先される。※無効なラベルを指定すると、OSのタイムゾーン(ローカル時刻)になる
異なるタイムゾーンにおけるラベルの不一致OSのタイムゾーン @Text( a; "D0T0Z2“ )ZE9 2018/11/10 12:00:00 PDTPST 2018/11/10 12:00:00 PSTdt := @TextToTime("2018/10/10 12:00:00 PDT");a := @Adjust( dt; 0; 1; 0; 0; 0; 0; [InGMT] );OSのタイムゾーンが異なる場合、夏時間が有効のままOSのタイムゾーンがPSTの場合、標準時に変換される10月10日の1カ月後は標準時(PST)に戻る
LotusScript と夏時間
LotusScript に日付/時刻データ型は無いhttps://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/LSAZ_SUMMARY_OF_LOTUSSCRIPT_DATA_TYPES.html
日時を扱う関数の戻り値は Variant 型日付/時刻CDat 関数Now 関数日付のみDate 関数DateNumber 関数DataValue 関数Today 関数時刻のみTime 関数TimeNumber 関数TimeValue 関数タイムゾーンを扱う関数は存在しない
Variant 型の日付0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000064ビット(= 8バイト)整数部=日付 小数部=時刻LotusScript では日付として西暦100年1月1日(-657434)から9999年12月31日(2958465)までの範囲を許容0は1899年12月30日を表す
うーん…Dim varTime As VariantvarTime = CDat( "2018/10/10 10:00 AMZE9" )
Variant 型はタイムゾーンを扱えないでは、どうする?
NotesDateTime クラスメソッドAdjustDayAdjustHourAdjustMinuteAdjustMonthAdjustSecondAdjustYearConvertToZoneNewSetAnyDateSetAnyTimeSetNowTimeDifferenceTimeDifferenceDoubleプロパティDateOnlyGMTTimeIsDSTIsValidDateLocalTimeLSGMTTimeLSLocalTimeParentTimeOnlyTimeZoneZoneTime
【参考】NotesDateTimeクラスのプロパティプロパティ 値GMTTIME GMTの時刻(文字列)LOCALTIME GMTTIMEをOSのタイムゾーンに合わせた時刻(文字列)ZONETIME GMTTIMEからTIMEZONEのオフセットとISDSTを反映した時刻(文字列)TIMEZONE タイムゾーン(-12から12)ISDST 夏時間有効のときTrue
使い分けが必要Variant 型 NotesDateTime クラスタイムゾーン 扱わない 扱う夏時間 扱わない 扱う
タイムゾーンのラベルに注目
Variant から NotesDateTime へ変換日時値にOSのタイムゾーン設定が反映PDT 太平洋夏時間UTC -7ZE9 日本標準時UTC +9
計算結果に夏時間が反映する【OSのタイムゾーン設定】太平洋標準時2018年の夏時間は11月4日 2時0分に終了PDT 太平洋夏時間UTC -7PST 太平洋標準時UTC -82カ月加算
計算結果に夏時間が反映しない【OSのタイムゾーン設定】日本標準時PDT 太平洋夏時間UTC -7PDT のまま!!2カ月加算
異なるタイムゾーンにおけるラベルの不一致ラベルは PST になる ラベルは PDT のまま2018年11月5日は太平洋標準時 PST で夏時間終了の翌日だが、あえて夏時間を示すラベル PDT を付けて変換を試みたOSのタイムゾーンをPSTに設定 OSのタイムゾーンをZE9に設定IsDST は False に変わる IsDST は True のまま
まとめ
夏時間対応の完全な検証実施はOSのタイムゾーン情報更新なしには困難式言語 LotusScriptタイムゾーンの扱い ○ NotesDateTimeクラス夏時間の扱い ○ NotesDateTimeクラス夏時間実施の切替 ○ NotesDateTimeクラス夏時間の開始/終了日付指定 ○ ×夏時間の開始/終了時刻指定 × ×繰り上げ時間の指定 × ×異なるタイムゾーンの夏時間に絡む日時の計算× ×
ところでラベル「JST」は有効?
JST 日本標準時の記載ありhttps://www.ibm.com/developerworks/jp/lotus/iris_today/20010301_5.html
ラベルのリストを取得する@LocationGetTZ(1)JST が無い…夏時間のラベルも無い…
どのラベルが有効?Dim dateTime As New NotesDateTime("Today 06:00")msg = "Zone" & Chr(9) + "Time"For i = -12 To 12Call dateTime.ConvertToZone(i, False)msg = msg & Chr(10) & dateTime.TimeZone & Chr(9) & _dateTime.ZoneTimeNextMessageBox msg,, "Today 06:00 Standard Time"False: 標準時True: 夏時間標準時 夏時間JST は無い…夏時間のラベルはある
JST は自動変換できないShift + F9Shift + F9OSのタイムゾーン時刻になる※つまりサポートされていない?Shift + F9
勝手な想像ですが…https://github.com/eggert/tz/blob/2018c/asia# JST Jerusalem Standard Time [Danny Braniss, Hebrew University]# JST (Japan Standard Time) has been used since 1888-01-01 00:00 (JST).エルサレム標準時も「JST」と呼ばれ、タイムゾーンの特定が困難なためNotesで使われなくなったのでは?
ご清聴ありがとうございました