etc.negui.system.time

タイマーというか時間関係。
std.timeがあまりにもあれだったんで置き換え。
class TimeException: etc.negui.system.exception.NeGuiException;
このモジュールで発行される例外の親玉。
class FileDateTimeException: etc.negui.system.time.TimeException;
FILEDATETIMEに関する例外。
struct FILEDATETIME;
ファイル時刻。
FILETIMEのラッパー。
History:
1.100
  • 新規作成。
static SYSTEMDATETIME toSystemDateTime(ref const FILEDATETIME FileDateTime );
ファイル時刻->システム日時形式変換。
Params:
FILEDATETIME FileDateTime
変換したいファイル時刻。
Returns:
変換されたシステム日時形式。
Throws:
変換失敗時にFileDateTimeException。
const SYSTEMDATETIME toSystemDateTime();
システム日時形式変換。
Returns:
自身の情報を元に変換されたシステム日時形式。
Throws:
変換失敗時にFileDateTimeException。
static FILEDATETIME toLocalFileDateTime(ref const FILEDATETIME FileDateTime );
UTCファイル時刻->ローカルファイル時刻変換。
Params:
FILEDATETIME FileDateTime
変換したいUTCファイル時刻情報。
Returns:
変換されたローカルファイル時刻。
Throws:
変換失敗時にFileDateTimeException。
const FILEDATETIME toLocalFileDateTime();
ローカルファイル時刻変換。
Returns:
自身の情報を元に変換されたローカルファイル時刻。
Throws:
変換失敗時にFileDateTimeException。
static FILEDATETIME toSystemFileDateTime(ref const FILEDATETIME FileDateTime );
ローカルファイル時刻->UTCファイル時刻変換。
Returns:
変換されたUTCファイル時刻。
Throws:
変換失敗時にFileDateTimeException。
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に関する例外。
struct SYSTEMDATETIME;
History:
1.100
  • 新規作成。
SYSTEMTIME SystemTime;
実体。
const FILEDATETIME toFileDateTime(ref const SYSTEMDATETIME SystemDateTime );
システム日時->ファイル時刻変換。
Params:
SYSTEMDATETIME SystemDateTime
変換したいシステム日時情報。
Returns:
変換されたファイル時刻。
Throws:
変換失敗時にSystemDateTimeException。
const FILEDATETIME toFileDateTime();
ファイル時刻変換。
Returns:
自身の情報を元に変換された変換されたファイル時刻。
Throws:
変換失敗時にSystemDateTimeException。
static SYSTEMDATETIME localTime();
現在のローカル日時を取得。
Retuens:
現在のローカル日時情報。
const bool opEquals(ref const SYSTEMDATETIME SystemDateTime );

const int opCmp(ref const SYSTEMDATETIME SystemDateTime );

const Text 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 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の公式
See Also:
ウィキペディア, http://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F
In:
isYear(Year ) && isMonth(Month ) && isDay(Day )
static WORD getMonthDay(WORD Year , WORD Month );
月の日数。
Params:
WORD Year
調べたい年。
WORD Month
調べたい月。
In:
isYear(Year ) && isMonth(Month )
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 )
class DateTimeException: etc.negui.system.time.SystemDateTimeException;
DateTimeに関する例外。
class DateTimeParseException: etc.negui.system.time.DateTimeException;
DateTime(MODE, in Text)に関する例外。
class DateTime: etc.negui.system.text.IText;
日時を扱う専用クラス。
ネムぃに特化。
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(".[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("[@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.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("Jan"));

 // それっぽく日曜日
 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.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 Text FormatDate(in Text FormatText , MASK Mask );
Note:
もう少しこう、スマートにしたい。
protected static Throwable TogetherAssignment(ref SYSTEMDATETIME SystemDateTime );
Note:
取り敢えずべた書き。
static immutable Text defaultFormat;
標準書式。
History:
1.101
  • 新規作成。
static immutable Text[] defaultMonths;
標準月名。
History:
1.101
  • 新規作成。
static immutable Text[] defaultWeeks;
標準曜日名。
History:
1.101
  • 新規作成。
protected void Initialize(MODE Mode );
History:
1.101
  • program初期化処理の定数部分を若干変更。
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] this.year

年の桁数を下二桁に指定。 10未満の場合は0で埋める。

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

年の桁数を下四桁に指定。 1000未満の場合は0で埋める。

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

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

[M] this.month

月の桁数を指定しない。

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

月の桁数を二桁に指定。

データ 1 9 10
変換後 01 09 10
[D] this.day

日の桁数を指定しない。

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

日の桁数を二桁に指定。

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

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

[W] this.week

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

データ 0 3 6
変換後 0 3 6
[h] this.hour

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

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

時間の桁数を二桁に指定。

データ 1 9 10
変換後 01 09 10
[m] this.minute

分の桁数を指定しない。

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

分の桁数を二桁に指定。

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

分の桁数を指定しない。

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

分の桁数を二桁に指定。

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

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

データ 123 12 1
変換後 123 012 001
[MS] this.ms

ミリ秒の桁数を三桁に指定。

データ 123 12 1
変換後 123 012 001
Text[12u] months;
月の文字列。
Text[7u] weeks;
曜日の文字列。
const const(Text) monthName();
日時情報から現在の月名を取得。
const const(Text) weekName();
日時情報から現在の曜日名を取得。
enum MASK;
文字列変換時の変換マスク。
該当しない箇所は文字列変換されない。
History:
1.101
  • othersドキュメント内の文言をマスクに統一。
YEAR
年。
MONTH
月。
DAY
日。
WEEK
曜日。
HOUR
時。
MINUTE
分。
SECOND
秒。
MS
ミリ秒。
DATE
年・月・日。
DATES
年・月・日・曜日。
TIME
時・分・秒。
TIMES
時・分・秒・ミリ秒。
ALL
全て。
MASK mask;
変換マスク。
enum MODE;
日時設定時の動作。
FLEXIBLE
あふれる場合は次に進めたりする。
STRICT
問答無用で例外。
MODE mode;
挙動
protected void ChangeWeek();

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

enum FLAG;

FLAG flags;

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