// 現在時刻を元に生成
auto dt1=new DateTime();
// 一月末日に設定
dt1.month = 1;
dt1.day = 31;
// 四月に設定
dt1.month = 4;
assert(dt1.day == 30); // 四月の末日は30日
// モード変更
dt1.mode = DateTime.MODE.STRICT;
// 一月末日に設定
dt1.month = 1;
dt1.day = 31;
try {
// 四月に設定
dt1.month = 4;
assert(false);
} catch(DateTimeException) {
// 四月の末日は30日なので例外が飛んでくる
assert(true);
}
// 指定時刻を元に生成
// FLEXIBLEで2010/1/32を生成
auto dt2=new DateTime(DateTime.MODE.FLEXIBLE,
2010, 1, 32
);
// 一月末の次の日で2/1
assert(dt2.month == 2);
assert(dt2.day == 1);
// STRICTで2010/1/32を生成
try {
auto dt3=new DateTime(
DateTime.MODE.STRICT,
2010, 1, 32
);
assert(false);
} catch(DateTimeException) {
// STRICTだと怒られる。
assert(true);
}
// 文字列から生成
// YYYY-MM-DDThh:mm:ss.MS形式ならDateTimeに変更可能
with(new DateTime(DateTime.MODE.FLEXIBLE, Text("2010-01-02T03:04:05.678"))) {
assert(year == 2010);
assert(month == 1);
assert(day == 2);
assert(hour == 3);
assert(minute == 4);
assert(second == 5);
assert(ms == 678);
}
// 限定的に生成することも可能
with(new DateTime(DateTime.MODE.FLEXIBLE, Text("2010-12"))) {
assert(year == 2010);
assert(month == 12);
assert(day == 1);
assert(hour == 0);
assert(minute == 0);
assert(second == 0);
assert(ms == 0);
}
// FLEXIBLEで生成
with(new DateTime(DateTime.MODE.FLEXIBLE, Text("2010-12-33"))) {
assert(year == 2011);
assert(month == 1);
assert(day == 2);
}
try {
// STRICTで生成
with(new DateTime(DateTime.MODE.STRICT, Text("2010-12-33"))) {
assert(false);
}
} catch(DateTimeException) {
// やっぱり怒られる
assert(true);
}
// 文字列化と書式とマスク
// まずは 2010-01-02T03:04:05.006 で生成
auto dt4=new DateTime(DateTime.MODE.FLEXIBLE, 2010, 1, 2, 3, 4, 5, 6);
// ミリ秒が無い
assert(dt4.toText == Text("2010-01-02T03:04:05"));
// DateTimeのデフォルト書式にそもそもミリ秒が無い
assert(dt4.format == Text("[YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]"));
// 書式設定、ミリ秒を追加。
dt4.format ~= Text(".[MS]");
// 追加完了
assert(dt4.format == Text("[YYYY]-[MM]-[DD]T[hh]:[mm]:[ss].[MS]"));
// でもなんか変
assert(dt4.toText == Text("2010-01-02T03:04:05.[MS]"));
// そもそもデフォルトマスクにミリ秒指定が無い
assert((dt4.mask & DateTime.MASK.MS) != DateTime.MASK.MS);
// マスクを設定
dt4.mask |= DateTime.MASK.MS;
// 設定完了
assert((dt4.mask & DateTime.MASK.MS) == DateTime.MASK.MS);
// 文字列化
assert(dt4.toText == Text("2010-01-02T03:04:05.006"));
// 色々文字列化
// 下二桁の年
dt4.format = Text("[YY]");
assert(dt4.toText == Text("10"));
// 0で埋めない
dt4.format = Text("[Y]-[M]-[D]T[h]:[m]:[s].[ms]");
assert(dt4.toText == Text("2010-1-2T3:4:5.6"));
// 曜日
dt4.mask |= DateTime.MASK.WEEK;
dt4.format = Text("[@Ww]");
// 2010/1/2は土曜日
assert(dt4.toText == Text("Sat"));
assert(dt4.week == SYSTEMDATETIME.WEEK.SATURDAY);
// 2010/1/3は日曜日
dt4.day = 3;
assert(dt4.toText == Text("Sun"));
assert(dt4.week == SYSTEMDATETIME.WEEK.SUNDAY);
// モード変更, 2010/1/4は月曜日
dt4.mode = DateTime.MODE.STRICT;
dt4.day = 4;
assert(dt4.toText == Text("Mon")); // STRICTでも曜日は勝手に変わる
assert(dt4.week == SYSTEMDATETIME.WEEK.MONDAY);
// 曜日名の変更, 2010/1/5は火曜日
dt4.format = Text("[@W]");
dt4.weeks[SYSTEMDATETIME.WEEK.TUESDAY] = Text("火曜日");
dt4.day = 5;
assert(dt4.toText == Text("火曜日"));
assert(dt4.week == SYSTEMDATETIME.WEEK.TUESDAY);
// 月も数値じゃなくて名前でとってみる
dt4.format = Text("[@M]");
assert(dt4.toText == Text("January"));
// それっぽく日曜日
dt4.day = 3;
dt4.format = Text("[@Ww] [@Mm] [D] [hh]:[mm]:[ss] [YYYY]");
assert(dt4.toText == Text("Sun Jan 3 03:04:05 2010"));
年の桁数を指定しない。
データ | 12345 | 1234 | 123 | 12 | 1 |
---|---|---|---|---|---|
変換後 | 12345 | 1234 | 123 | 12 | 1 |
年の桁数を下二桁に指定。 10未満の場合は0で埋める。
データ | 12345 | 1234 | 123 | 12 | 1 |
---|---|---|---|---|---|
変換後 | 45 | 34 | 23 | 12 | 01 |
年の桁数を下四桁に指定。 1000未満の場合は0で埋める。
データ | 12345 | 1234 | 123 | 12 | 1 |
---|---|---|---|---|---|
変換後 | 2345 | 1234 | 0123 | 0012 | 0001 |
月の名称を独自の月名で指定。 DateTime.monthName()を使用してDateTime.monthsから月名を使用する。
月の名称を標準の長い名前で指定。 DateTime.defaultMonthsを使用する。
月の名称を標準の短い名前で指定。 DateTime.defaultMonthsを使用する。
月の桁数を指定しない。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 1 | 9 | 10 |
月の桁数を二桁に指定。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 01 | 09 | 10 |
日の桁数を指定しない。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 1 | 9 | 10 |
日の桁数を二桁に指定。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 01 | 09 | 10 |
曜日の名称を独自の曜日名で指定。 DateTime.weekName()を使用してDateTime.weeksから曜日名を使用する。
月の名称を標準の長い名前で指定。 DateTime.defaultWeeksを使用する。
月の名称を標準の短い名前で指定。 DateTime.defaultWeeksを使用する。
曜日を表す番号を指定。 詳細はSYSTEMDATETIME.WEEKを参照。
データ | 0 | 3 | 6 |
---|---|---|---|
変換後 | 0 | 3 | 6 |
時間の桁数を指定しない。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 1 | 9 | 10 |
時間の桁数を二桁に指定。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 01 | 09 | 10 |
十二時間表記で時間の桁数を指定しない。
データ | 1 | 11 | 13 | 23 |
---|---|---|---|---|
変換後 | 1 | 11 | 1 | 11 |
十二時間表記で時間の桁数を二桁に指定。
データ | 1 | 11 | 13 | 23 |
---|---|---|---|---|
変換後 | 01 | 11 | 01 | 11 |
分の桁数を指定しない。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 1 | 9 | 10 |
分の桁数を二桁に指定。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 01 | 09 | 10 |
分の桁数を指定しない。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 1 | 9 | 10 |
分の桁数を二桁に指定。
データ | 1 | 9 | 10 |
---|---|---|---|
変換後 | 01 | 09 | 10 |
ミリ秒の桁数を指定しない。
データ | 123 | 12 | 1 |
---|---|---|---|
変換後 | 123 | 12 | 1 |
ミリ秒の桁数を三桁に指定。
データ | 123 | 12 | 1 |
---|---|---|---|
変換後 | 123 | 012 | 001 |
午前午後を独自の名前で指定。 DateTime.hourとSYSTEMDATETIME.getMeridiemを使用してDateTime.meridiemsから午前午後を使用する。
午前午後を標準の名前で指定。 DateTime.defaultMeridiemsを使用する。
データ | 0 | 11 | 12 | 23 |
---|---|---|---|---|
変換後 | AM | AM | PM | PM |