import { DateExpressionLexer } from "../text/lexer/DateExpressionLexer"; import { LexerQuery } from "../text/lexer/LexerQuery"; import { DateMath } from "./DateMath"; export class DateHelper { static now() { let date = new Date(); return date; } static nowMS() { return this.now().getTime(); } static today() { let date = new Date(); date.setHours( 0, 0, 0 ); return date; } static createYMD( year:number, month:number = 1, day:number = 1, hours:number = 0, minutes:number = 0, seconds:number = 0 ) { let date = new Date(); date.setFullYear( year ); date.setMonth( month - 1 ); date.setDate( day ); date.setHours( hours, minutes, seconds ); return date; } static parseDateExpression( expression:string ):Date { let query = LexerQuery.from( expression, new DateExpressionLexer() ); // console.log( "\n\n>>", expression, ">>>", query.tokens.map( tk => tk.isDoneOrError ? "" : ( "[" + tk.type + ":" + tk.match + "]" ) ).join( ", " ) ); let now = query.find( le => le.isMatcher( DateExpressionLexer.Now ) ); if ( now ) { // console.log( "is now" ); return DateHelper.now(); } let time = query.find( le => le.isMatcher( DateExpressionLexer.Time ) ); let hourMinutesSeconds = ( time?.match || "9:00" ).split( ":" ).map( s => parseInt( s ) ); let hours = hourMinutesSeconds[ 0 ]; let minutes = hourMinutesSeconds[ 1 ]; let seconds = hourMinutesSeconds.length == 3 ? hourMinutesSeconds[ 2 ] : 0; let year = DateHelper.now().getFullYear(); let month = DateHelper.now().getMonth() + 1; let day = DateHelper.now().getDate(); let date = query.find( le => /date/i.test( le.type ) ); if ( ! date ) { let currentDate = DateHelper.createYMD( year, month, day, hours, minutes, seconds ); if ( DateMath.isInThePast( currentDate ) ) { currentDate = DateMath.addDays( currentDate, 1 ); } return currentDate; } let seperator = /slash/i.test( date.type ) ? "/" : /dot/i.test( date.type ) ? "." : "-"; let values = date.match.replace( /(\/|\.|\-)$/, "" ).split( seperator ).map( s => parseInt( s ) ); if ( /reverse/i.test( date.type ) ) { year = values[ 0 ]; month = values[ 1 ]; day = values[ 2 ]; } else { day = values[ 0 ]; month = values[ 1 ]; if ( values.length == 3 ) { year = values[ 2 ]; if ( year < 100 ) { year += 2000; } } } return DateHelper.createYMD( year, month, day, hours, minutes, seconds ); } }