etc.negui.system.time

タイマーというか時間関係。
std.timeがあまりにもあれだったんで置き換え。 作ってみたはいいけどあんまりな実装。
DateTimeじゃ範囲取れなかったりするから何とかしないと。
class TimeException: etc.negui.system.exception.NeGuiException;
このモジュールで発行される例外の親玉。
History:
1.120
  • sourcetypedefから継承へ。
1.110
  • source暫定的に継承からtypedefへ。
class FileDateTimeException: etc.negui.system.time.TimeException;
FILEDATETIMEに関する例外。
History:
1.120
  • sourcetypedefから継承へ。
1.110
  • source暫定的に継承からtypedefへ。
struct FILEDATETIME;
ファイル時刻。
FILETIMEのラッパー。
History:
1.100
  • 新規作成。
FILETIME FileTime;
実体。 FileTimeとfullは共用。
long full;
なんとなく FileTimeとfullは共用。
static SYSTEMDATETIME toSystemDateTime(ref const FILEDATETIME FileDateTime );
ファイル時刻->システム日時形式変換。
Params:
FILEDATETIME FileDateTime
変換したいファイル時刻。
Returns:
変換されたシステム日時形式。
Throws:
変換失敗時にFileDateTimeException。
History:
1.110
  • program例外発行時のメッセージをERRで出力。
const SYSTEMDATETIME toSystemDateTime();
システム日時形式変換。
Returns:
自身の情報を元に変換されたシステム日時形式。
Throws:
変換失敗時にFileDateTimeException。
static FILEDATETIME toLocalFileDateTime(ref const FILEDATETIME FileDateTime );
UTCファイル時刻->ローカルファイル時刻変換。
Params:
FILEDATETIME FileDateTime
変換したいUTCファイル時刻情報。
Returns:
変換されたローカルファイル時刻。
Throws:
変換失敗時にFileDateTimeException。
History:
1.110
  • program例外発行時のメッセージをERRで出力。
const FILEDATETIME toLocalFileDateTime();
ローカルファイル時刻変換。
Returns:
自身の情報を元に変換されたローカルファイル時刻。
Throws:
変換失敗時にFileDateTimeException。
static FILEDATETIME toSystemFileDateTime(ref const FILEDATETIME FileDateTime );
ローカルファイル時刻->UTCファイル時刻変換。
Returns:
変換されたUTCファイル時刻。
Throws:
変換失敗時にFileDateTimeException。
History:
1.110
  • program例外発行時のメッセージをERRで出力。
const FILEDATETIME toSystemFileDateTime();
UTCファイル時刻変換。
Returns:
自身の情報を元に変換されたUTCファイル時刻。
Throws:
変換失敗時にFileDateTimeException。
const bool opEquals(ref const FILEDATETIME FileDateTime );

const int opCmp(ref const FILEDATETIME FileDateTime );

class SystemDateTimeException: etc.negui.system.time.TimeException;
SYSTEMDATETIMEに関する例外。
History:
1.120
  • sourcetypedefから継承へ。
1.110
  • source暫定的に継承からtypedefへ。
1.100
  • 新規作成。
struct SYSTEMDATETIME;
システム日時。
SYSTEMTIMEのラッパー。
History:
1.100
  • 新規作成。
SYSTEMTIME SystemTime;
実体。
const FILEDATETIME toFileDateTime(ref const SYSTEMDATETIME SystemDateTime );
システム日時->ファイル時刻変換。
Params:
SYSTEMDATETIME SystemDateTime
変換したいシステム日時情報。
Returns:
変換されたファイル時刻。
Throws:
変換失敗時にSystemDateTimeException。
History:
1.110
  • program例外発行時のメッセージをERRで出力。
const FILEDATETIME toFileDateTime();
ファイル時刻変換。
Returns:
自身の情報を元に変換された変換されたファイル時刻。
Throws:
変換失敗時にSystemDateTimeException。
static SYSTEMDATETIME localTime();
現在のローカル日時を取得。
Returns:
現在のローカル日時情報。
const bool opEquals(ref const SYSTEMDATETIME SystemDateTime );

const int opCmp(ref const SYSTEMDATETIME SystemDateTime );

const ConsText toText();

const string toString();
string toString();

enum RANGE;
最小/最大値
MONTH_MIN
MONTH_MAX
DAY_MIN
DAY_MAX
WEEK_MIN
WEEK_MAX
曜日
HOUR_MIN
HOUR_MAX
MINUTE_MIN
MINUTE_MAX
SECOND_MIN
SECOND_MAX
MS_MIN
MS_MAX
ミリ秒
static bool isYear(WORD Year );
年として合法か。
0年ならfalseとする。
static bool isMonth(WORD Value );
static bool isDay(WORD Value );
static bool isWeek(WORD Value );
static bool isHour(WORD Value );
static bool isMinute(WORD Value );
static bool isSecond(WORD Value );
static bool isMs(WORD Value );
各要素の最大最小値チェック。
Params:
WORD Value
要素の対する値。
Returns:
範囲内であればtrue、範囲外であればfalseを返す。
単純な定数チェックであり、 指定要素以外の影響を受けないことに注意。
static bool isLeapYear(WORD Year );
閏年判定。
Params:
WORD Year
調べたい年。
In:
isYear(Year )
enum WEEK;
曜日。
SUNDAY
日曜日。
MONDAY
月曜日。
TUESDAY
火曜日。
WEDNESDAY
水曜日。
THURSDAY
木曜日。
FRIDAY
金曜日。
SATURDAY
土曜日。
static WEEK getWeekDay(in WORD Year , in WORD Month , in WORD Day );
曜日の取得。
Returns:
WEEK。
Standards:
Zellerの公式
In:
isYear(Year ) && isMonth(Month ) && isDay(Day )
static WORD daysInMonth(WORD Year , WORD Month );
月の日数。
Params:
WORD Year
調べたい年。
WORD Month
調べたい月。
In:
isYear(Year ) && isMonth(Month )
History:
1.130
  • sourcePhobosに合わせて名前変更(getMonthDay -> daysInMonth)。
static WORD nextMonth(WORD NowMonth );
次の月を取得。
Params:
WORD NowMonth
現在の月。
Returns:
来月。
In:
isMonth(NowMonth )
static WORD prevMonth(WORD NowMonth );
前の月を取得。
Params:
WORD NowMonth
現在の月。
Returns:
先月。
In:
isMonth(NowMonth )
static WORD nextDay(WORD Year , WORD Month , WORD Day );
次の日を取得。
Params:
WORD Year
現在の年。
WORD Month
現在の月。
WORD Day
現在の日。
Returns:
次の日。
In:
isYear(Year ) && isMonth(Month ) && isDay(Day )
static WORD prevDay(WORD Year , WORD Month , WORD Day );
前の日を取得。
Params:
WORD Year
現在の年。
WORD Month
現在の月。
WORD Day
現在の日。
Returns:
前の日。
In:
isYear(Year ) && isMonth(Month ) && isDay(Day )
enum MERIDIEM;
午前・午後。
History:
1.110
  • 新規作成。
AM
午前。
PM
午後。
static MERIDIEM getMeridiem(WORD Hour );
時間から午前・午後の取得。
Params:
WORD Hour
調べる時間。
Returns:
MERIDIEM。
In:
isHour(Hour )
History:
1.110
  • 新規作成。
static WORD getMeridiemHour(WORD Hour );
時間を午前午後に変換。
Returns:
変換された値。
In:
isHour(Hour )
History:
1.110
  • 新規作成。
class DateTimeException: etc.negui.system.time.SystemDateTimeException;
DateTimeに関する例外。
History:
1.120
  • sourcetypedefから継承へ。
1.110
  • source暫定的に継承からtypedefへ。
1.100
  • 新規作成。
class DateTimeParseException: etc.negui.system.time.DateTimeException;
DateTime(MODE, in Text)に関する例外。
class DateTime: etc.negui.system.text.IText, etc.negui.system.raii.IInitialize;
日時を扱う専用クラス。
ネムぃに特化。
BUGS:
調子乗りすぎた。 もうしんどい、いやや。
タイムゾーンに関しては知識がないから未実装だよ。
Examples:
 // 現在時刻を元に生成
 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(".[ff]");
 // 追加完了
 assert(dt4.format == Text("[YYYY]-[MM]-[DD]T[hh]:[mm]:[ss].[ff]"));
 // でもなんか変
 assert(dt4.toText == Text("2010-01-02T03:04:05.[ff]"));
 // そもそもデフォルトマスクにミリ秒指定が無い
 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].[f]");
 assert(dt4.toText == Text("2010-1-2T3:4:5.6"));
 // 曜日
 dt4.mask |= DateTime.MASK.WEEK;
 dt4.format = Text("[@$W]");
 // 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("[@$W] [@$M] [D] [hh]:[mm]:[ss] [YYYY]");
 assert(dt4.toText == Text("Sun Jan 3 03:04:05 2010"));
History:
1.110
  • sourceIInitializeを継承。
1.101
  • programweekの不変条件をmaskに関係なく行うように変更。
1.100
  • source全面修正
1.00β19
  • sourceTimeを継承
protected const Text FormatSingle(in Text FormatText , in Text TargetToken , int Width , int Value );

protected const const(Text) FormatDate(in Text FormatText , MASK Mask , MODE Mode );
History:
1.130
  • programMODEに影響されないように変更。
  • program]が見つからなかった際の挙動を変更。
  • programText.replaceToWordの利用、若干高速化。
1.120
  • features書式の大幅変更。
  • features若干の高速化。
  • program'['を表示可能に。
1.110
  • program[@MM], [@Mm], [@WW], [@Ww], [@h], [@hh], [@AP], [@ap]の追加。
protected static Throwable TogetherAssignment(ref SYSTEMDATETIME SystemDateTime );
Note:
取り敢えずべた書き。
static immutable Text defaultFormat;
標準書式。
History:
1.101
  • 新規作成。
static immutable _NTEXT!(wchar)[12u] defaultMonths;
標準月名。
History:
1.110
  • program短縮形ではない形に変更。
1.101
  • 新規作成。
static immutable _NTEXT!(wchar)[7u] defaultWeeks;
標準曜日名。
History:
1.110
  • program短縮形ではない形に変更。
1.101
  • 新規作成。
static immutable _NTEXT!(wchar)[2u] defaultMeridiems;
History:
1.110
  • 新規作成。
protected void Initialize(MODE Mode );
History:
1.110
  • programmonths, weeksの初期化処理をinitializeへ。
1.101
  • program初期化処理の定数部分を若干変更。
protected void _initialize();
書式、月名と曜日名の初期化。
formatをdefaultFormatに設定。 months, weeksにdefaultMonths, defaultWeeksの値を設定。
History:
1.110
  • 新規作成。
this(MODE Mode = (MODE).FLEXIBLE);
現在時刻からDateTimeの生成。
Params:
MODE Mode
日時設定時の挙動。
this(MODE Mode , ref const SYSTEMDATETIME SystemDateTime );
指定日時からDateTimeの生成。
Params:
MODE Mode
日時設定時の挙動。
SYSTEMDATETIME SystemDateTime
設定する日時情報。
Throws:
ModeがMODE.STRICTでSystemDateTimeが不正な場合にDateTimeException。
this(MODE Mode , ref const FILEDATETIME FileDateTime );
指定日時からDateTimeの生成。
Params:
MODE Mode
日時設定時の挙動。
FILEDATETIME FileDateTime
設定する日時情報。
Throws:
ModeがMODE.STRICTでFileDateTimeが不正な場合にDateTimeException。
this(MODE Mode , WORD Year , WORD Month = (RANGE).MONTH_MIN, WORD Day = (RANGE).DAY_MIN, WORD Hour = (RANGE).HOUR_MIN, WORD Minute = (RANGE).MINUTE_MIN, WORD Second = (RANGE).SECOND_MIN, WORD Ms = (RANGE).MS_MIN);
指定日時からDateTimeの生成。
Params:
MODE Mode
日時設定時の挙動。
WORD Year
年。
WORD Month
月。
WORD Day
日。
WORD Hour
時。
WORD Minute
分。
WORD Second
秒。
WORD Ms
ミリ秒。
Throws:
ModeがMODE.STRICTで引数が不正な場合にDateTimeException。
this(MODE Mode , in Text Value );
文字列からDateTimeの生成。
Params:
MODE Mode
日時設定時の挙動。
Text Value
日時情報に変換可能な文字列。 YYYY-MM-DDThh:mm:ss.MS形式(0埋め不要)で指定。
年以外は順々に省略可能。
Throws:
Valueを分解できない場合にDateTimeParseException。 ModeがMODE.STRICTで引数が不正な場合にDateTimeException。
History:
1.101
  • featuresDateTimeParseException追加。
  • bug分割後の代入でひたすら例外。
Text format;
日時書式。
[Y] this.year

年の桁数を指定しない。

データ 12345 1234 123 12 1
変換後 12345 1234 123 12 1
[YY], [#YY] this.year

年の桁数を下二桁に指定。 10未満の場合、[YY]は0、[#YY]は空白で埋める。

データ 12345 1234 123 12 1
変換後 45 34 23 12 01
[YYYY], [#YYYY] this.year

年の桁数を下四桁に指定。 1000未満の場合、[YYYY]は0、[#YYYY]は空白で埋める。

データ 12345 1234 123 12 1
変換後 2345 1234 0123 0012 0001
[M] this.month

月の桁数を指定しない。

データ 1 9 10
変換後 1 9 10
[MM], [#MM] this.month

月の桁数を二桁に指定。 10未満の場合、[MM]は0、[#MM]は空白で埋める。

データ 1 9 10
変換後 01 09 10
[@M] this.month

月の名称を独自の月名で指定。 DateTime.monthName()を使用してDateTime.monthsから月名を使用する。

[@$MM] this.month

月の名称を標準の長い名前で指定。 DateTime.defaultMonthsを使用する。

[@$M] this.month

月の名称を標準の短い名前で指定。 DateTime.defaultMonthsを使用する。

[D] this.day

日の桁数を指定しない。

データ 1 9 10
変換後 1 9 10
[DD], [#DD] this.day

日の桁数を二桁に指定。 10未満の場合、[DD]は0、[#DD]は空白で埋める。

データ 1 9 10
変換後 01 09 10
[W] this.week

曜日を表す番号を指定。 詳細はSYSTEMDATETIME.WEEKを参照。

データ 0 3 6
変換後 0 3 6
[@W] this.week

曜日の名称を独自の曜日名で指定。 DateTime.weekName()を使用してDateTime.weeksから曜日名を使用する。

[@$WW] this.week

曜日の名称を標準の長い名前で指定。 DateTime.defaultWeeksを使用する。

[@$W] this.week

曜日の名称を標準の短い名前で指定。 DateTime.defaultWeeksを使用する。

[h] this.hour

時間の桁数を指定しない。

データ 1 9 10
変換後 1 9 10
[hh], [#hh] this.hour

時間の桁数を二桁に指定。 10未満の場合、[hh]は0、[#hh]は空白で埋める。

データ 1 9 10
変換後 01 09 10
[@h] this.hour

十二時間表記で時間の桁数を指定しない。

データ 1 11 13 23
変換後 1 11 1 11
[@hh], [@#hh] this.hour

十二時間表記で時間の桁数を二桁に指定。 10未満の場合、[@hh]は0、[@#hh]は空白で埋める。

データ 1 11 13 23
変換後 01 11 01 11
[m] this.minute

分の桁数を指定しない。

データ 1 9 10
変換後 1 9 10
[mm], [#mm] this.minute

分の桁数を二桁に指定。 10未満の場合、[mm]は0、[#mm]は空白で埋める。

データ 1 9 10
変換後 01 09 10
[s] this.second

秒の桁数を指定しない。

データ 1 9 10
変換後 1 9 10
[ss], [#ss] this.second

秒の桁数を二桁に指定。 10未満の場合、[ss]は0、[#ss]は空白で埋める。

データ 1 9 10
変換後 01 09 10
[f] this.ms

ミリ秒の桁数を指定しない。

データ 123 12 1
変換後 123 12 1
[ff], [#ff] this.ms

ミリ秒の桁数を三桁に指定。 100未満の場合、[ff]は0、[#ff]は空白で埋める。

データ 123 12 1
変換後 123 012 001
[@AP] this.hour

午前午後を独自の名前で指定。 DateTime.hourとSYSTEMDATETIME.getMeridiemを使用してDateTime.meridiemsから午前午後を使用する。

[@$AP] this.hour

午前午後を標準の名前で指定。 DateTime.defaultMeridiemsを使用する。

データ 0 11 12 23
変換後 AM AM PM PM
Note:
ミリ秒の指定方法を変えたい。
History:
1.130
  • bug[s], [ss], [#ss]のドキュメントが分の説明。
1.120
  • features書式内容の変更。
1.110
  • program月と曜日の標準書式追加。
  • program午前午後の書式と標準書式追加。
  • bug[ms]のドキュメントが[MS]と同じ。
_NTEXT!(wchar)[12u] months;
月の文字列。
_NTEXT!(wchar)[7u] weeks;
曜日の文字列。
_NTEXT!(wchar)[2u] meridiems;
AM/PM。
History:
1.110
  • 新規作成。
enum FORMAT;
書式。
History:
1.110
  • 新規作成。
DEFAULT

void changeFormat(FORMAT Format );
書式の一括変更。
DateTime.formatと違い、全ての書式を変更する。
Params:
FORMAT Format
書式。
History:
1.110
  • 新規作成。
const const(Text) monthName();
日時情報から現在の月名を取得。
const ConsText weekName();
日時情報から現在の曜日名を取得。
enum MASK;
文字列変換時の変換マスク。
該当しない箇所は文字列変換されない。
History:
1.110
  • sourceAM_PM追加。
1.101
  • othersドキュメント内の文言をマスクに統一。
YEAR
年。
MONTH
月。
DAY
日。
WEEK
曜日。
HOUR
時。
MINUTE
分。
SECOND
秒。
MS
ミリ秒。
AM_PM
AM/PM。
DATE
年・月・日。
DATES
年・月・日・曜日。
TIME
時・分・秒。
TIMES
時・分・秒・ミリ秒。
ALL
全て。
MASK mask;
変換マスク。
enum MODE;
日時設定時の動作。
FLEXIBLE
あふれる場合は次に進めたりする。
STRICT
問答無用で例外。
MODE mode;
挙動
protected void ChangeWeek();

const SYSTEMDATETIME.WEEK week();
日時情報から現在の曜日を取得。
const ConsText toText();
文字列変換
maskとformatを元に文字列変換。
Returns:
maskがMASK.DATE | MASK.TIMES、formatが[YYYY]-[MM]-[DD]T[hh]:[mm]:[ss].[ff]ならSYSTEMDATETIME.toTextを呼び出し。 それ以外はDateTimeがちまちま変換。
History:
1.101
  • bugSYSTEMDATETIME.toTextは曜日を含まないのでmaskがMASK.DATE | MASK.TIMESの時にSYSTEMDATETIME.toTextと等価
1.100
  • programmaskがMASK.ALLであればSYSTEMDATETIME.toTextと等価。
const bool isLeapYear();
閏年判定。
SYSTEMDATETIME.isLeapYearを内部で呼び出し。
History:
1.110
  • 新規作成。
struct TIMESTAMP;

enum FLAG;

FLAG flags;

DateTime create;
作成日時。
DateTime access;
アクセス日時。
DateTime update;
更新日時。
const ConsText toText();