#Alert-1940 DATE変換における問題について
INTRODUCTION:
VOSオペレーティングシステムでdate変換問題が発生することが確認されました。この問題は、VOSが正確に1から31の範囲で、1または2桁の年にdate/timeストリングが解釈することに伴います。 このアラートは、この問題が適切なテスト、または、ソフトウェアが正確に動作することを確保するためのコード検査をユーザが行えるためのものです。この問題はvos-4792として報告されています。
VOSサブルーチンマニュアルは、s$cv_to_int_date_time サブルーチンは異なるdate/time入力形式の数を受け入れると説明しています。
オンラインマニュアル:
VOS PL/Iサブルーチンマニュアル
VOS COBOLサブルーチンマニュアル
VOS FORTRANサブルーチンマニュアル
VOS Pascalサブルーチンマニュアル
VOS C サブルーチンマニュアル
EXPLANATION:
s$cv_to_int_date_timeは多くのdate/timeフォーマットを受け付けます。この記述は特定の年と月(両方とも数字)、年と月と日(全て数字)、そして、年の前にカンマは用いないフォーマットに影響されます。 このサブルーチンはデリミタとして少なくとも3つのISO/ASCIIキャラクター:ピリオド、フォワードスラッシュ、ハイフンを受け付けることを思い出してください。デリミタが使われることは、テキストストリングの解釈に重要ではないということも思い出してください。唯一要求されることは2つのデリミタが文字列内で同じでなければならないことです。
04-05
04.05
04/05
3つのdate/timeトークンを以下に示します
01-02-03
01/02/03
01.02.03
0づめ(リーディング・ゼロ)も不必要であるが、ここでの説明に一貫させるために用いることにします。
上記のストリングに表されるのは何日ですか? 以下に示すVOSマニュアルで説明されます:
2つのトークン形式(04-05)では、複数のトークンの1つが年を表さなければならない値をもつ場合、他のトークンは月です。(0または、80から99の範囲、32から48の範囲、1980から2048の範囲ならば、トークンの1つが年にならなければなりません)
さもなければ、トークンの1つが月として解釈され、他のトークンが月内で日として解釈されます。月と日の相対的な順番は、languages.tinのカレントプロセス言語のdate_formatアイテムから得られます。US English、Japanese、Koreanのデフォルトdate形式はYY-MM-DDであり、上述の2つのトークンdate-timeストリングは今年の April 5th に変換されます。
French, German, Italian, Spanish のデフォルトdate形式はDD-MM-YYであり、上述の2つのトークンdate-timeストリングは今年の May 4th に変換されます。
3つのトークン形式(01-02-03)では, ファースト・トークン、または、ラスト・トークンが年を表さなければならない値をもつ場合、他の2つのトークンは月と日として解釈されます。年はミドル・トークンにはなりません。ファースト・トークン、ラスト・トークン両方が年で表されれなければならない値(両方が1から31の範囲内)をもたない場合、年、月、日の相対的な順番はlanguages.tinから同様に得られます。
デフォルトdate形式がYY-MM-DDのとき、上述の3つのトークンdate-timeストリングのそれぞれがFebruary 3, 2001に変換され、DD-MM-YYのときには、それぞれがFebruary 1, 2003に変換されます。VOSが明確に年を検出できるときのみ、2つの異なるdate形式がサポートされます。しかしながら、2001年と2031年にわたる31年間はVOSが丁度2桁として表現される年がファーストトークンがラストトークンか判断する材料を持ちません。
この状況はプログラムに対してと同じほど人間をも混乱させます。プログラムの推量は以下の連続で、8キャラクタdate/timeストリングを生成しています。
INPUT EXPECTED DATE VOS INTERPRETATION
12/28/00 December 28, 2000 same.
12/29/00 December 29, 2000 same.
12/30/00 December 30, 2000 same.
12/31/00 December 31, 2000 same.
01/01/01 January 1, 2001 same.
01/02/01 January 2, 2001 February 1, 2001!
01/03/01 January 3, 2001 March 1, 2001!
01/12/01 January 12, 2001 December 1, 2001!
01/13/01 January 13, 2001 invalid!
言うまでもなく、このプログラムは1980から2001年1月を通して適切に稼動して、突然 2001年1月2日にフェイルし始めます。十中八九、この状況を検出する唯一の方法は、2001年に多くの日時について注意深くプログラムをテストするということになります。
要約すると、年が1980年から2000年、2032年から2048年を通し表されるdate/timeストリングは VOSが常に年を見つけられるために明確です。これらの年のために、人間かVOSソフトウェアは最初か最後のどちらかの2-digit年でdate/time入力ストリングを用いられます。そのようなストリングとして、
01/02/99
99-02-01
99.02.01
01-02-99
は全て同一に解釈されます。 人間とVOSソフトウェアの両方とも2桁の年が特定された最初か最後のどちらであろうが明確に確定できます。使用法は languages.tinで流行言語の特定された1つのフォーマットと一致しなければならなりません。4桁の年を使うことはyear-firstと year-lastフォーマットの両方をサポートするためにVOSの能力を復元します。
01 02,03 January 2, 2003 (US English)
01 02,03 February 1, 2003 (French)
このフォーマットも8キャラクタを必要とし、危険で混乱した XX.YY.ZZ, XX/YY/ZZ または、XX-YY-ZZ 形式のためのサブルーチンとなります。
RECOMMENDATIONS:
弊社では、テストは2001年を通した2031年内の多様日で実行され、ソフトウェアを正しく実行したことを確実にするためのy2kテスト計画をレビューされることを強く推奨します。
また、ソフトウェアは異なるVOS言語のもと、異なるdate/timeの変換ルールのもとで操作しなければならないことを強く推奨します。最後に、全てのソフトウェアがs$cv_to_int_date_timeに入力として4桁の年を完全に使用することを推奨します。これは、日時変換過程に曖昧や混乱がないことを保証します。
WORKAROUND:
ソフトウェアは常に、月、日はlanguages.tinの特定のdate/timeに一致した2桁年の順番でdate/timeストリングが組み立てられます。さもなければ、ソフトウェアをlanguages.tinと同じ順番で年、月、日を指定するように変更しなければなりません。または、ソフトウェアにより使われる同じ順番に指定するためにはlanguages.tinを変更しなければならなりません。リーディング(先頭)の2-digit年とトレーリング(後尾)の2桁年の両方を使い続けられるケースはありません。
最善の方法は4桁年を使うためにソフトウェアを変更することです。これにより、人かソフトウェアのどちらかに起こりうる曖昧がありません。
整数date/time値をキャラクタ形式へ変換するいくつかのサブルーチンは、カレントプロセス言語のdate_formatフィールドに依存しています。従って、languages.tinでdate_formatを変更する場合 s$cv_to_long_string_date_time,s$cv_to_std_date_time,s$cv_to_std_date_time_and_zone, s$cv_to_strings_date_time, s$std_date_time, s$std_date_time_and_zoneにより作成されたoutput formatも変更されます。
故に、注意深くテストすることなしにシステム構成を変更するべきではありません。
その他ご質問、ご不明な点、または万が一問題が発生した場合は、保守契約窓口にご連絡下さい。
![]() |
![]() |
ストラタス製品のお見積りをご希望の方はこちらから承ります。 お見積り詳細 |
|
![]() |
![]() |
製品やサービス、購入方法、その他のお問合せはこちらから承ります。 お問合せ詳細 |
|
![]() |
![]() |
ストラタス製品に関する技術資料などをダウンロードいただけます。 資料ダウンロード詳細 |
|
![]() |
![]() |
ストラタス製品に関する資料請求はこちらから承ります。 資料請求詳細 |