///
module TDev.RT {
//? A combination of date and time
//@ stem("dt") immutable ctx(general,indexkey,cloudfield,json) serializable
export class DateTime
extends RTValue
{
constructor() {
super()
}
static mkFull(year:number, month:number, day:number, hour:number, minute:number, second:number) : DateTime
{
var r = new DateTime();
r.d = new Date(year, month - 1, day, hour, minute, Math.floor(second));
var rem = second - Math.floor(second);
if (rem) {
r.d = new Date(r.d.getTime() + rem * 1000);
}
return r;
}
static mkMs(ms:number) : DateTime
{
var r = new DateTime();
r.d = new Date(ms);
return r;
}
static mk(d:Date) : DateTime
{
var r = new DateTime();
r.d = new Date(d.getTime());
return r;
}
static parse(s : string) : DateTime
{
if (!s) return undefined;
var d = Date.parse(s);
if (!d) return undefined;
return DateTime.mkMs(d);
}
// 0001-01-01 00:00:00 GMT, Monday
static defaultValue = DateTime.mkMs(-62135596800000);
public d:Date;
public isSerializable() { return true; }
public toJsonKey():any { return this.d.getTime(); }
//? Converts the value into a json data structure.
public to_json(): JsonObject {
return JsonObject.wrap(this.d.getTime());
}
public keyCompareTo(o:any):number
{
var other:DateTime = o;
return this.d.getTime() - other.d.getTime();
}
public isDefaultValue():boolean
{
return this.equals(DateTime.defaultValue);
}
//? Returns a date that adds the specified number of days to the value of this instance.
//@ [days].defl(1)
public add_days(days:number) : DateTime { return this.add_seconds(days * 24 * 3600); }
//? Returns a date that adds the specified number of hours to the value of this instance.
//@ [hours].defl(1)
public add_hours(hours:number) : DateTime { return this.add_seconds(hours * 3600); }
//? Returns a date that adds the specified number of minutes to the value of this instance.
//@ [minutes].defl(1)
public add_minutes(minutes:number) : DateTime { return this.add_seconds(minutes * 60); }
//? Returns a date that adds the specified number of seconds to the value of this instance.
//@ [seconds].defl(1)
public add_seconds(seconds:number) : DateTime { return DateTime.mkMs(this.d.getTime() + seconds * 1000); }
//? Returns a date that adds the specified number of milliseconds to the value of this instance.
//@ [milliseconds].defl(1)
public add_milliseconds(milliseconds:number) : DateTime { return DateTime.mkMs(this.d.getTime() + milliseconds); }
//? Computes the difference between date-times in seconds
public subtract(value:DateTime) : number { return (this.d.getTime() - value.d.getTime()) / 1000; }
//? Compares dates for equality
public equals(other:DateTime) : boolean { return this.d.getTime() == other.d.getTime(); }
//? Compares dates for disequality
public not_equals(other:DateTime) : boolean { return !this.equals(other); }
//? Compares dates for less or equal
public less_or_equals(other:DateTime) : boolean { return this.d.getTime() <= other.d.getTime(); }
//? Compares dates for less
public less(other:DateTime) : boolean { return this.d.getTime() < other.d.getTime(); }
//? Compares dates for greater or equal
public greater_or_equal(other:DateTime) : boolean { return this.d.getTime() >= other.d.getTime(); }
//? Compares dates for greater
public greater(other:DateTime) : boolean { return this.d.getTime() > other.d.getTime(); }
//? Converts a dates to a string
public to_string() : string { return this.d.toString(); } // TODO use the same format
public toString(): string { return this.d.toUTCString(); }
// ctx is ignored
public exportJson(ctx: JsonExportCtx): any {
return this.d.toJSON();
}
// ctx is ignored
static mkFromJson(ctx: JsonImportCtx, json: any): DateTime {
if (typeof (json) === "string") {
return DateTime.mk(new Date( json));
}
else
return undefined;
}
private clone() : DateTime { return DateTime.mk(this.d); }
//? Gets the date
public date() : DateTime
{
var r = this.clone();
( r.d).setHours(0, 0, 0, 0);
return r;
}
//? Gets the milliseconds elapsed since January 1, 1970 UTC; same as getTime() in JavaScript.
public milliseconds_since_epoch():number {
return this.d.getTime();
}
//? Converts into text that describes the elapsed time in a friendly way.
public from_now(): string
{
return Util.timeSince(this.d.getTime() / 1000);
}
//? Gets the day of the month
public day() : number { return this.d.getDate(); }
//? Gets the hour
public hour() : number { return this.d.getHours(); }
//? Gets the millisecond
public millisecond() : number { return this.d.getMilliseconds(); }
//? Gets the minute
public minute() : number { return this.d.getMinutes(); }
//? Gets the month
public month() : number { return this.d.getMonth() + 1; }
//? Gets the second
public second() : number { return this.d.getSeconds(); }
//? Gets the year
public year() : number { return this.d.getFullYear(); }
//? Gets the day of the week (sunday = 0, monday = 1, ... saturday = 6)
public week_day() : number { return this.d.getDay(); }
//? Gets the day of the year between 1 and 366
public year_day() : number
{
var first = new Date(this.d.getTime());
( first).setMonth(0, 1);
return Math.round((this.d.getTime() - first.getTime()) / (24 * 3600 * 1000)) + 1;
}
//? Returns a date that adds the specified number of years to the value of this instance.
//@ stub
//@ [years].defl(1)
public add_years(years: number): DateTime
{ return undefined; }
//? Returns a date that adds the specified number of months to the value of this instance.
//@ stub
//@ [months].defl(1)
public add_months(months:number) : DateTime
{ return undefined; }
//? Converts coordinated universal time
public to_universal_time(): DateTime
{
return DateTime.mk(new Date(
this.d.getUTCFullYear(),
this.d.getUTCMonth(),
this.d.getUTCDate(),
this.d.getUTCHours(),
this.d.getUTCMinutes(),
this.d.getUTCSeconds())
);
}
//? Converts to the local time
//@ stub
public to_local_time(): DateTime
{ return undefined; }
//? Prints the date to the wall
public post_to_wall(s: IStackFrame): void { super.post_to_wall(s) }
public debuggerDisplay(clickHandler: () => any) {
var tempSpan: HTMLElement;
tempSpan = span(null, this.toString()).withClick(clickHandler);
return tempSpan;
}
}
}