記事
Toshihiko Minamoto · 2022年11月2日 7m read

時間の支配者になるには ー誕生

良識のある人にはルールなんていらない。

ドクター

日付と時間のマスターになるのは簡単なことではありません。いつも問題になる上、どのようなプログラミング言語でも混乱することがあります。そこでこのタスクが可能な限り単純になるように、分かりやすく説明していくつかのヒントをご紹介しましょう。

さぁ、ターディスに乗り込みましょう。あなたを時間の支配者にして差し上げます。

ターディス

基本から始めよう

普段、他の言語を使用しているのであれば、InterSystems Object Script(以降「IOS」と呼びますが、Apple モバイルと勘違いしないように)の日付は少し独特です。
ターミナルで $HOROLOG を実行して現在の日付と時刻を取得する場合、2 つの部分に分割されているのがわかります。

WRITE $HOROLOG

> 66149,67164

最初の値は日にちです。正確には 1840 年 12 月 31 日以来の日数であり、つまり値 1 は 1841 年 1 月 1 日となります。2 つ目の値は今日の 00:00 時以来の秒数です。

この例では、66149 は 09/02/2022(欧州フォーマットの dd/mm/yyyy なので 2 月 9 日)、67164 は 18:39:24 に対応しています。 このフォーマットを日付と時刻の内部フォーマットと呼ぶことにします。

混乱してきましたか? (日付と時刻の)宇宙の大きな秘密を解明し始めることにしましょう。

 

内部フォーマットをわかりやすいフォーマットに変換するには?

それについては、$ZDATETIME コマンドを使用します。

基本的なコマンドは以下のようになります。

SET RightNow = $HOROLOG
WRITE RightNow

> 66149,67164
WRITE $ZDATETIME(RightNow)

> 02/09/2022 18:39:24

デフォルトでは、アメリカ式フォーマット(mm/dd/yyyy)を使用します。 別のフォーマットで日付を表す場合は、欧州フォーマット(dd/mm/yyyy)など2 つ目のパラメーターを使用し、この場合は値 4 を指定します(詳細については、ドキュメントの $ZDATETIME.dformat をご覧ください)。

SET RightNow = $HOROLOG
WRITE RightNow

> 66149,67164

WRITE $ZDATETIME(RightNow,4)

> 09/02/2022 18:39:24

このオプションは、ローカル変数で定義したものを区切り文字と年フォーマットを使用します。

また、別の時間フォーマットを使用したい場合、たとえば 24 時間制ではなく 12 時間制(午前/午後)を使用したい場合は、3 つ目のパラメータを値 3 とし、秒数を表示しない場合は、値 4 を使用します(ドキュメントの $ZDATETIME.tformat を参照)。

SET RightNow = $HOROLOG
WRITE RightNow

> 66149,67164

WRITE $ZDATETIME(RightNow,4,3)

> 09/02/2022 06:39:24PM

WRITE $ZDATETIME(RightNow,4,4)

> 09/02/2022 06:39PM

わかってきましたか? ではもっと詳しく見てみましょう。

ODBC フォーマット

このフォーマットはローカル構成に依存しておらず、常に yyyy-mm-dd として表示されます。この値は 3 です。 CSV、HL7 などのファイルでエクスポートされるデータを作成する際は、これを使用することをお勧めします。

SET RightNow = $HOROLOG
WRITE RightNow

> 66149,67164

WRITE $ZDATETIME(RightNow,3)

> 2022-02-09 18:39:24

曜日、曜日名、年間通産日

説明
10 曜日は 0 から 6 の値で、日曜日は 0、土曜日は 6 です。
11 曜日の略名で、ユーザーが定義するローカル構成に基づいて返します。IRIS のデフォルトインストールは enuw(英語、米国、Unicode)です。
12 ロング形式の曜日名。 11 と同じです。
14 年間通産日。つまり 1 月 1 日からの日数です。

日付と時刻を個別に扱う場合は、それぞれ $ZDATE コマンドと $ZTIME コマンドを使用します。 フォーマットのパラメーターは、$ZDATETIME.dformat$ZDATETIME.tformatで定義されているパラメーターと同じです。

SET RightNow = $HOROLOG
WRITE RightNow

> 66149,67164

WRITE $ZDATE(RightNow,10)

> 3

WRITE $ZDATE(RightNow,11)

> Wed

WRITE $ZDATE(RightNow,12)

> Wednesday

日付を内部フォーマットに変換するには?

では、逆のステップを見てみましょう。日付のあるテキストを IOS フォーマットに変換する方法です。 このタスクでは、$ZDATETIMEH コマンドを使用します。

今度は、日付と時刻に使用されているフォーマット($ZDATETIMEH を使用している場合)、または日付($ZDATEH)または時刻($ZTIMEH)に使用されているフォーマットを個別に示す必要があります。

フォーマットは同じです。つまり、ODBC フォーマット(yyyy-mm-dd)の日付を持つ文字列がある場合は、値 3 を使用します。

SET MyDatetime = "2022-02-09 18:39:24"
SET Interna1 = $ZDATETIMEH(MyDatetime, 3, 1) // ODBC フォーマット

SET MyDatetime = "09/02/2022 18:39:24"
SET Interna2 = $ZDATETIMEH(MyDatetime, 4, 1) // 欧州フォーマット

SET MyDatetime = "02/09/2022 06:39:24PM"
SET Interna3 = $ZDATETIMEH(MyDatetime, 1, 3) // 米国フォーマット、12 時間制 AM/PM
WRITE Interna1,!,Interna2,!,Interna3

> 66149,67164
66149,67164
66149,67164

論理的に、文字列が特定のフォーマットを使用しており、誤ったパラメーターを指定した場合は、2 月 9 日ではなく 9 月 2 日として理解するなど、どのようなことでも起こりえます。

フォーマットを混在させないようにしましょう。後で問題になります。

SET MyDatetime = "09/02/2022"

/// 米国フォーマット
SET InternalDate = $ZDATEH(MyDatetime, 1) 

/// 欧州フォーマット
SET OtherDate = $ZDATETIME(InternalDate, 4)
WRITE InternalDate,!,OtherDate

> 66354
02/09/2022

もちろん、欧州式の日付を設定し、米国式に変換しようとすると ... バレンタインデーはどうなってしまうのでしょうか?

SET MyDatetime = "14/02/2022"
SET InternalDate = $ZDATEH(MyDatetime, 1) // 米国フォーマット。 14 月は存在しません!!!
^
<ILLEGAL VALUE>

ハートブレイクなバレンタインデーと同じように... コードブレイクしてしまいました。

では、学習した内容を使って、何かやってみましょう。

READ !,"Please indicate your date of birth (dd/mm/yyyy): ",dateOfBirth
SET internalFormat = $ZDATEH(dateOfBirth, 4)
SET dayOfWeek= $ZDATE(internalFormat, 10)
SET nameOfDay = $ZDATE(internalFormat, 12)
WRITE !,"The day of the week of your birth is: ",nameOfDay
IF dayOfWeek = 5 WRITE "you always liked to party!!!" // 金曜日生まれ

後で、これを他のやり方で行う方法と、エラーの処理方法を見ることにしましょう。

 

次の章: タイムトラベルの方法

 

トリビア

なぜ 1841年1月1日の値が値1 となるのでしょうか?
それが選択された理由は、オブジェクトスクリプトを拡張した MUMPS プログラミング言語が設計されたときに、南北戦争の退役軍人として当時生存していた最年長 121 歳のアメリカ人が生まれる前のうるう年でない年であったためです。

@Kurro Lopezさんが書いた元の記事へ
1
0 33
ディスカッション (1)3
続けるにはログインするか新規登録を行ってください

>オブジェクトスクリプトを拡張した MUMPS プログラミング言語が設計されたときに

これは逆ですね。

MUMPSプログラミング言語を拡張したオブジェクトスクリプト