Upgrade to Pro — share decks privately, control downloads, hide ads and more …

サマータイム導入【開発者編】

 サマータイム導入【開発者編】

日本でもサマータイムが導入されたら Domino にどのような影響があるのかを検証してみました。

2018年12月13日開催の「のの会 第10回」で使用した資料です。

Haruyuki Nakano

September 17, 2022
Tweet

More Decks by Haruyuki Nakano

Other Decks in Technology

Transcript

  1. サマータイム導入?
    【開発者編】
    その時 Notes/Domino は正確な時刻を刻むのか

    View Slide

  2. サマータイム?2年限定?2時間!
    https://www.sankei.com/politics/news/180806/plt1808060002-n1.html

    View Slide

  3. 前回のおさらい

    View Slide

  4. Notes/Domino のサマータイム対応
    • サマータイムの情報(開始/終了の日時等)はタイムゾーン情報に含まれている
    • Notes/Domino は基本的にはOSのタイムゾーン設定に依存している
    • サーバーとクライアントの両方で(Windows Update等による)タイムゾーン情
    報の更新が必要
    • 既存文書の古いタイムゾーン情報を更新するツールが公開されている
    • サマータイムの切替日は「ServerTasksAt?=」とプログラム文書に注意せよ
    • 2時間進めるサマータイムに対応できるのか?

    View Slide

  5. Notesの
    タイムゾーン

    View Slide

  6. タイムゾーンと夏時間の実施状況を示す
    「ラベル」
    https://www.ibm.com/developerworks/jp/lotus/iris_today/20010301_5.html

    View Slide

  7. フィールドの種類「タイムゾーン」
    選択肢
    保存される値

    View Slide

  8. 式言語と夏時間

    View Slide

  9. タイムゾーンを扱う@関数
    @GetCurrentTimeZone オペレーティングシステムの現在のタイムゾーン設定を、正規のタイム
    ゾーン形式で返します
    @TimeToTextInZone 日時値を文字列に変換し、このときタイムゾーン情報を取り込みます
    @TimeZoneToText 正規のタイムゾーン値を、読み取り可能な文字列に変換します
    @TimeMerge 別々に指定された日付、時刻、およびタイムゾーンの値から日時値を作
    成します
    @Zone 現在のコンピュータまたは指定された日時値のタイムゾーン設定を返し、
    サマータイムを実施しているかどうかを示します

    View Slide

  10. タイムゾーンを扱う@関数
    @GetCurrentTimeZone オペレーティングシステムの現在のタイムゾーン設定を、正規のタイム
    ゾーン形式で返します
    @TimeToTextInZone 日時値を文字列に変換し、このときタイムゾーン情報を取り込みます
    @TimeZoneToText 正規のタイムゾーン値を、読み取り可能な文字列に変換します
    @TimeMerge 別々に指定された日付、時刻、およびタイムゾーンの値から日時値を作
    成します
    @Zone 現在のコンピュータまたは指定された日時値のタイムゾーン設定を返し、
    サマータイムを実施しているかどうかを示します

    View Slide

  11. 【参考】正規のタイムゾーン値
    Z=9$DO=1$DL=4 1 1 10 -1 1$ZX=1$ZN=Alaskan
    Z タイムゾーンの GMT からの時差。上記はGMTの9時間後であることを示している
    DO サマータイム (DST : Daylight Saving Time) 監視フラグ。
    1 はサマータイムが有効であることを示し、0 は無効であることを示します。1 の場合は
    DL に値が渡されます
    DL <開始月> <開始週> <開始曜日> <終了月> <終了週> <終了曜日> を特定するサマータイ
    ムのルール
    ZX ホスト固有のタイムゾーンインデックス
    ZN タイムゾーン名
    正規のタイムゾーン値には、夏時間を適用する「年」、開始/終
    了の「時刻」、「進める時間の長さ」を示す情報が無い

    View Slide

  12. 【検証】日本のタイムゾーン値を変える
    Z=-9$DO=
    1$DL=
    4 1 1 10 1 1$ZX=110$ZN=Tokyo
    4月の第一日曜 10月の第一日曜
    夏時間を有効化
    @GetCurrentTimezone の戻り値
    “Z=-9$DO=0$ZX=110$ZN=Tokyo”

    View Slide

  13. 【検証】日本のタイムゾーン値を変える
    夏時間の実施状況
    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時間進む
    開始/終了が逆?

    View Slide

  14. 【参考】デフォルトの切り替え時刻
    https://www-01.ibm.com/support/docview.wss?uid=ibm10734019
    Notes.ini にDSTLAWTIME が定義されていない場合
    夏時間は午前2時に始まり、午前1時に終わる

    View Slide

  15. 【検証】日本のタイムゾーン値を変える
    切り替え時刻
    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時

    View Slide

  16. 【検証】日本のタイムゾーン値を変える
    結果
    @TimeMerge + @Text
    • 正規のタイムゾーン値がOS
    のタイムゾーン値と異なる
    場合、想定した日時が返ら
    ない?
    @TimeToTextInZone
    • 想定した値が返る

    View Slide

  17. 式言語
    日付コーディング
    の癖
    OSのタイムゾーンを変えて検証

    View Slide

  18. Designer 上で現地時刻に自動変換
    ZE9で保存、PSTで開く
    OSのタイムゾーン:ZE9 OSのタイムゾーン:PST
    @Text の結果はどちらも
    “2018/10/10 12:00:00 ZE9”

    View Slide

  19. 夏時間の自動変換(開始日時)
    OSのタイムゾーン:PST
    存在しない時刻を指定すると
    (1時59分59秒の1秒後は3時)
    存在する時刻へ自動変換

    View Slide

  20. 夏時間の自動変換(終了日時)
    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 PST
    1秒後のつもりで指定すると… (1秒後は 2018/11/04 00:00:00 PST だが)
    1時間と1秒後

    View Slide

  21. 日時はそのまま、ラベルだけ変わる
    dt :[email protected]( "2018/10/10 12:00:00" )
    OSのタイムゾーン @Text( dt; “D0T0Z2“ ) の結果
    ZE9 2018/10/10 12:00:00 ZE9
    PST 2018/10/10 12:00:00 PDT
    @TextToTime の値にタイムゾーンが無い場合、
    現在のOSのタイムゾーンが適用される。

    View Slide

  22. 特定の地域の日時をハードコードするなら
    dt := @TextToTime( "2018/10/10 12:00:00 ZE9" )
    OSのタイムゾーン @Text( dt; “D0T0Z2“ ) の結果
    ZE9 2018/10/10 12:00:00 ZE9
    PST 2018/10/10 12:00:00 ZE9
    @TextToTime の値にあるラベルが
    現在のOSのタイムゾーンより優先される。
    ※無効なラベルを指定すると、OSのタイムゾーン(ローカル時刻)になる

    View Slide

  23. 異なるタイムゾーンにおける
    ラベルの不一致
    OSのタイムゾーン @Text( a; "D0T0Z2“ )
    ZE9 2018/11/10 12:00:00 PDT
    PST 2018/11/10 12:00:00 PST
    dt := @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)に戻る

    View Slide

  24. LotusScript と
    夏時間

    View Slide

  25. LotusScript に日付/時刻データ型は無い
    https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/LSAZ_SUMMARY_OF_LOTUSSCRIPT_DATA_TYPES.html

    View Slide

  26. 日時を扱う関数の戻り値は Variant 型
    日付/時刻
    CDat 関数
    Now 関数
    日付のみ
    Date 関数
    DateNumber 関数
    DataValue 関数
    Today 関数
    時刻のみ
    Time 関数
    TimeNumber 関数
    TimeValue 関数
    タイムゾーンを扱う関数は存在しない

    View Slide

  27. Variant 型の日付
    0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
    64ビット(= 8バイト)
    整数部=日付 小数部=時刻
    LotusScript では日付として西暦100年1月1日(-657434)から9999
    年12月31日(2958465)までの範囲を許容
    0は1899年12月30日を表す

    View Slide

  28. うーん…
    Dim varTime As Variant
    varTime = CDat( "2018/10/10 10:00 AM
    ZE9" )

    View Slide

  29. Variant 型はタイムゾーンを扱えない
    では、どうする?

    View Slide

  30. NotesDateTime クラス
    メソッド
    AdjustDay
    AdjustHour
    AdjustMinute
    AdjustMonth
    AdjustSecond
    AdjustYear
    ConvertToZone
    New
    SetAnyDate
    SetAnyTime
    SetNow
    TimeDifference
    TimeDifferenceDouble
    プロパティ
    DateOnly
    GMTTime
    IsDST
    IsValidDate
    LocalTime
    LSGMTTime
    LSLocalTime
    Parent
    TimeOnly
    TimeZone
    ZoneTime

    View Slide

  31. 【参考】NotesDateTimeクラスのプロパティ
    プロパティ 値
    GMTTIME GMTの時刻(文字列)
    LOCALTIME GMTTIMEをOSのタイムゾーンに合わ
    せた時刻(文字列)
    ZONETIME GMTTIMEからTIMEZONEのオフセッ
    トとISDSTを反映した時刻(文字列)
    TIMEZONE タイムゾーン(-12から12)
    ISDST 夏時間有効のときTrue

    View Slide

  32. 使い分けが必要
    Variant 型 NotesDateTime クラス
    タイムゾーン 扱わない 扱う
    夏時間 扱わない 扱う

    View Slide

  33. タイムゾーンの
    ラベルに注目

    View Slide

  34. Variant から NotesDateTime へ変換
    日時値にOSのタイムゾーン設定が反映
    PDT 太平洋夏時間
    UTC -7
    ZE9 日本標準時
    UTC +9

    View Slide

  35. 計算結果に夏時間が反映する
    【OSのタイムゾーン設定】
    太平洋標準時
    2018年の夏時間は
    11月4日 2時0分に終了
    PDT 太平洋夏時間
    UTC -7
    PST 太平洋標準時
    UTC -8
    2カ月加算

    View Slide

  36. 計算結果に夏時間が反映しない
    【OSのタイムゾーン設定】
    日本標準時
    PDT 太平洋夏時間
    UTC -7
    PDT のまま!!
    2カ月加算

    View Slide

  37. 異なるタイムゾーンにおける
    ラベルの不一致
    ラベルは PST になる ラベルは PDT のまま
    2018年11月5日は太平洋標準時 PST で夏時間終了の翌日だが、
    あえて夏時間を示すラベル PDT を付けて変換を試みた
    OSのタイムゾーンをPSTに設定 OSのタイムゾーンをZE9に設定
    IsDST は False に変わる IsDST は True のまま

    View Slide

  38. まとめ

    View Slide

  39. 夏時間対応の完全な検証実施は
    OSのタイムゾーン情報更新なしには困難
    式言語 LotusScript
    タイムゾーンの扱い ○ NotesDateTimeクラス
    夏時間の扱い ○ NotesDateTimeクラス
    夏時間実施の切替 ○ NotesDateTimeクラス
    夏時間の開始/終了日付指定 ○ ×
    夏時間の開始/終了時刻指定 × ×
    繰り上げ時間の指定 × ×
    異なるタイムゾーンの夏時間に絡
    む日時の計算
    × ×

    View Slide

  40. ところで
    ラベル「JST」は
    有効?

    View Slide

  41. JST 日本標準時の記載あり
    https://www.ibm.com/developerworks/jp/lotus/iris_today/20010301_5.html

    View Slide

  42. ラベルのリストを取得する
    @LocationGetTZ(1)
    JST が無い…
    夏時間のラベル
    も無い…

    View Slide

  43. どのラベルが有効?
    Dim dateTime As New NotesDateTime("Today 06:00")
    msg = "Zone" & Chr(9) + "Time"
    For i = -12 To 12
    Call dateTime.ConvertToZone(i, False)
    msg = msg & Chr(10) & dateTime.TimeZone & Chr(9) & _
    dateTime.ZoneTime
    Next
    MessageBox msg,, "Today 06:00 Standard Time"
    False: 標準時
    True: 夏時間
    標準時 夏時間
    JST は無い…
    夏時間の
    ラベルはある

    View Slide

  44. JST は自動変換できない
    Shift + F9
    Shift + F9
    OSのタイムゾーン時刻になる
    ※つまりサポートされていない?
    Shift + F9

    View Slide

  45. 勝手な想像ですが…
    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で使われなくなったのでは?

    View Slide

  46. ご清聴ありがとうございました

    View Slide