jsforce
Version:
Salesforce API Library for JavaScript
212 lines (199 loc) • 6.89 kB
text/typescript
/**
*
*/
import { zeroPad } from './util/formatter';
/** @private **/
function createLiteralBuilder(literal: string) {
return (num: number) => new SfDate(`${literal}:${String(num)}`); // eslint-disable-line no-use-before-define
}
/**
* A date object to keep Salesforce date literal
*
* @class
* @constructor
* @see http://www.salesforce.com/us/developer/docs/soql_sosl/Content/sforce_api_calls_soql_select_dateformats.htm
*/
export class SfDate {
private _literal: string;
/**
*
*/
constructor(literal: string) {
this._literal = literal;
}
/**
* Returns literal when converted to string
*/
toJSON() {
return this._literal;
}
toString = this.toJSON;
/**
* Convert JavaScript date object to ISO8601 Date format (e.g. 2012-10-31)
*
* @param {String|Number|Date} date - Input date
* @returns {SfDate} - Salesforce date literal with ISO8601 date format
*/
static toDateLiteral(date: string | number | Date) {
let _date: Date;
if (typeof date === 'number') {
_date = new Date(date);
} else if (typeof date === 'string') {
_date = SfDate.parseDate(date);
} else {
_date = date;
}
const yy = _date.getFullYear();
const mm = _date.getMonth() + 1;
const dd = _date.getDate();
const dstr = [yy, zeroPad(mm), zeroPad(dd)].join('-');
return new SfDate(dstr);
}
/**
* Convert JavaScript date object to ISO8601 DateTime format
* (e.g. 2012-10-31T12:34:56Z)
*/
static toDateTimeLiteral(date: string | number | Date) {
let _date: Date;
if (typeof date === 'number') {
_date = new Date(date);
} else if (typeof date === 'string') {
_date = SfDate.parseDate(date);
} else {
_date = date;
}
const yy = _date.getUTCFullYear();
const mm = _date.getUTCMonth() + 1;
const dd = _date.getUTCDate();
const hh = _date.getUTCHours();
const mi = _date.getUTCMinutes();
const ss = _date.getUTCSeconds();
const dtstr = `${[yy, zeroPad(mm), zeroPad(dd)].join('-')}T${[
zeroPad(hh),
zeroPad(mi),
zeroPad(ss),
].join(':')}Z`;
return new SfDate(dtstr);
}
/**
* Convert JavaScript date object to ISO8601 time format
* (e.g. 12:34:56.789Z)
*/
static toTimeLiteral(time: string | number | Date) {
let _date = new Date(0);
if (typeof time === 'string') {
_date = SfDate.parseTime(time);
} else if (typeof time === 'number') {
_date = new Date(time);
} else {
_date = time;
}
const hh = _date.getUTCHours();
const mi = _date.getUTCMinutes();
const ss = _date.getUTCSeconds();
const sss = _date.getUTCMilliseconds();
const tstr = `${zeroPad(hh)}:${zeroPad(mi)}:${zeroPad(ss)}.${zeroPad(
sss,
3,
)}Z`;
return new SfDate(tstr);
}
/**
* Parse IS08601 date(time) formatted string and return date instance
*/
static parseDate(str: string): Date {
let d = new Date();
const regexp = /^([\d]{4})-?([\d]{2})-?([\d]{2})(T([\d]{2}):?([\d]{2}):?([\d]{2})(.([\d]{3}))?(Z|([+-])([\d]{2}):?([\d]{2})))?$/;
const m = str.match(regexp);
if (m) {
d = new Date(0);
if (!m[4]) {
d.setFullYear(parseInt(m[1], 10));
d.setDate(parseInt(m[3], 10));
d.setMonth(parseInt(m[2], 10) - 1);
d.setHours(0);
d.setMinutes(0);
d.setSeconds(0);
d.setMilliseconds(0);
} else {
d.setUTCFullYear(parseInt(m[1], 10));
d.setUTCDate(parseInt(m[3], 10));
d.setUTCMonth(parseInt(m[2], 10) - 1);
d.setUTCHours(parseInt(m[5], 10));
d.setUTCMinutes(parseInt(m[6], 10));
d.setUTCSeconds(parseInt(m[7], 10));
d.setUTCMilliseconds(parseInt(m[9] || '0', 10));
if (m[10] && m[10] !== 'Z') {
const offset = parseInt(m[12], 10) * 60 + parseInt(m[13], 10);
d.setTime(
(m[11] === '+' ? -1 : 1) * offset * 60 * 1000 + d.getTime(),
);
}
}
return d;
}
throw new Error(`Invalid date format is specified : ${str}`);
}
/**
* Parse IS08601 time formatted string and convert to parse string
*/
static parseTime(str: string): Date {
const regexp = /^([\d]{2}):?([\d]{2}):?([\d]{2})(.([\d]{3}))?Z?$/;
const m = str.match(regexp);
if (m) {
const d = new Date(0);
const hh = parseInt(m[1], 10);
const mi = parseInt(m[2], 10);
const ss = parseInt(m[3], 10);
const sss = parseInt(m[5] || '0', 10);
d.setUTCHours(hh);
d.setUTCMinutes(mi);
d.setUTCSeconds(ss);
d.setUTCMilliseconds(sss);
return d;
}
throw new Error(`Invalid time format is specified : ${str}`);
}
static YESTERDAY = new SfDate('YESTERDAY');
static TODAY = new SfDate('TODAY');
static TOMORROW = new SfDate('TOMORROW');
static LAST_WEEK = new SfDate('LAST_WEEK');
static THIS_WEEK = new SfDate('THIS_WEEK');
static NEXT_WEEK = new SfDate('NEXT_WEEK');
static LAST_MONTH = new SfDate('LAST_MONTH');
static THIS_MONTH = new SfDate('THIS_MONTH');
static NEXT_MONTH = new SfDate('NEXT_MONTH');
static LAST_90_DAYS = new SfDate('LAST_90_DAYS');
static NEXT_90_DAYS = new SfDate('NEXT_90_DAYS');
static LAST_N_DAYS = createLiteralBuilder('LAST_N_DAYS');
static NEXT_N_DAYS = createLiteralBuilder('NEXT_N_DAYS');
static NEXT_N_WEEKS = createLiteralBuilder('NEXT_N_WEEKS');
static LAST_N_WEEKS = createLiteralBuilder('LAST_N_WEEKS');
static NEXT_N_MONTHS = createLiteralBuilder('NEXT_N_MONTHS');
static LAST_N_MONTHS = createLiteralBuilder('LAST_N_MONTHS');
static THIS_QUARTER = new SfDate('THIS_QUARTER');
static LAST_QUARTER = new SfDate('LAST_QUARTER');
static NEXT_QUARTER = new SfDate('NEXT_QUARTER');
static NEXT_N_QUARTERS = createLiteralBuilder('NEXT_N_QUARTERS');
static LAST_N_QUARTERS = createLiteralBuilder('LAST_N_QUARTERS');
static THIS_YEAR = new SfDate('THIS_YEAR');
static LAST_YEAR = new SfDate('LAST_YEAR');
static NEXT_YEAR = new SfDate('NEXT_YEAR');
static NEXT_N_YEARS = createLiteralBuilder('NEXT_N_YEARS');
static LAST_N_YEARS = createLiteralBuilder('LAST_N_YEARS');
static THIS_FISCAL_QUARTER = new SfDate('THIS_FISCAL_QUARTER');
static LAST_FISCAL_QUARTER = new SfDate('LAST_FISCAL_QUARTER');
static NEXT_FISCAL_QUARTER = new SfDate('NEXT_FISCAL_QUARTER');
static THIS_FISCAL_YEAR = new SfDate('THIS_FISCAL_YEAR');
static NEXT_N_FISCAL_QUARTERS = createLiteralBuilder(
'NEXT_N_FISCAL_QUARTERS',
);
static LAST_N_FISCAL_QUARTERS = createLiteralBuilder(
'LAST_N_FISCAL_QUARTERS',
);
static LAST_FISCAL_YEAR = new SfDate('LAST_FISCAL_YEAR');
static NEXT_FISCAL_YEAR = new SfDate('NEXT_FISCAL_YEAR');
static NEXT_N_FISCAL_YEARS = createLiteralBuilder('NEXT_N_FISCAL_YEARS');
static LAST_N_FISCAL_YEARS = createLiteralBuilder('LAST_N_FISCAL_YEARS');
}
export default SfDate;