UNPKG

@darkwolf/time.mjs

Version:
298 lines (245 loc) 6.94 kB
import Helper from '@darkwolf/helper.mjs' import Duration, { Unit } from '@darkwolf/duration.mjs' import { InvalidTimestampError } from '../errors/index.mjs' import Timestamp from './Timestamp.mjs' export default class UnixTimestamp { static now = Helper.unix static parse(timestamp) { if (Helper.isString(timestamp)) { if (/^\d+(?:\.\d+)?$/.test(timestamp)) { return parseFloat(timestamp) } else { const time = Date.parse(timestamp) if (Helper.isNaN(time)) { throw new InvalidTimestampError(timestamp) } else { return Duration.floatSeconds(time) } } } else if (Helper.isNumber(timestamp)) { return timestamp } else if (timestamp instanceof UnixTimestamp) { return timestamp.value } else if (timestamp instanceof Timestamp || timestamp instanceof Duration) { return timestamp.floatSeconds } else if (timestamp instanceof Date) { return Duration.floatSeconds(timestamp.getTime()) } else { throw new InvalidTimestampError(timestamp) } } static from(value) { return new UnixTimestamp(value) } static fromMilliseconds(milliseconds) { return new UnixTimestamp(Duration.floatSeconds(milliseconds)) } static fromMillis(millis) { return UnixTimestamp.fromMilliseconds(millis) } static fromSeconds(seconds) { return new UnixTimestamp(seconds) } constructor(duration, unit) { this.set(duration, unit) } get milliseconds() { return Duration.inSeconds(this.value) } get millis() { return this.milliseconds } get floatSeconds() { return this.value } get seconds() { return Math.floor(this.value) } get [Symbol.toStringTag]() { return 'UnixTimestamp' } setValue(value) { return this.setSeconds(Helper.exists(value) ? UnixTimestamp.parse(value) : Helper.unix()) } set(duration, unit) { return unit === Unit.MILLISECOND ? this.setMilliseconds(duration) : this.setValue(duration) } setMilliseconds(milliseconds) { return this.setSeconds(Duration.floatSeconds(milliseconds)) } setMillis(millis) { return this.setMilliseconds(millis) } setSeconds(seconds) { this.value = seconds return this } add(duration, unit) { if (unit) { switch (unit) { case Unit.YEAR: { return this.addYears(duration) } case Unit.QUARTER: { return this.addQuarters(duration) } case Unit.MONTH: { return this.addMonths(duration) } case Unit.WEEK: { return this.addWeeks(duration) } case Unit.DAY: { return this.addDays(duration) } case Unit.HOUR: { return this.addHours(duration) } case Unit.MINUTE: { return this.addMinutes(duration) } case Unit.MILLISECOND: { return this.addMilliseconds(duration) } } } return Helper.isNumber(duration) ? this.addSeconds(duration) : this.addMilliseconds(Duration.parse(duration)) } addMilliseconds(milliseconds) { return this.addSeconds(Duration.floatSeconds(milliseconds)) } addMillis(millis) { return this.addMilliseconds(millis) } addSeconds(seconds) { this.value += seconds return this } addMinutes(minutes) { return this.addMilliseconds(Duration.inMinutes(minutes)) } addHours(hours) { return this.addMilliseconds(Duration.inHours(hours)) } addDays(days) { return this.addMilliseconds(Duration.inDays(days)) } addWeeks(weeks) { return this.addMilliseconds(Duration.inWeeks(weeks)) } addMonths(months) { return this.addMilliseconds(Duration.inMonths(months)) } addQuarters(quarters) { return this.addMilliseconds(Duration.inQuarters(quarters)) } addYears(years) { return this.addMilliseconds(Duration.inYears(years)) } subtract(duration, unit) { if (unit) { switch (unit) { case Unit.YEAR: { return this.subtractYears(duration) } case Unit.QUARTER: { return this.subtractQuarters(duration) } case Unit.MONTH: { return this.subtractMonths(duration) } case Unit.WEEK: { return this.subtractWeeks(duration) } case Unit.DAY: { return this.subtractDays(duration) } case Unit.HOUR: { return this.subtractHours(duration) } case Unit.MINUTE: { return this.subtractMinutes(duration) } case Unit.MILLISECOND: { return this.subtractMilliseconds(duration) } } } return Helper.isNumber(duration) ? this.subtractSeconds(duration) : this.subtractMilliseconds(Duration.parse(duration)) } subtractMilliseconds(milliseconds) { return this.subtractSeconds(Duration.floatSeconds(milliseconds)) } subtractMillis(millis) { return this.subtractMilliseconds(millis) } subtractSeconds(seconds) { this.value -= seconds return this } subtractMinutes(minutes) { return this.subtractMilliseconds(Duration.inMinutes(minutes)) } subtractHours(hours) { return this.subtractMilliseconds(Duration.inHours(hours)) } subtractDays(days) { return this.subtractMilliseconds(Duration.inDays(days)) } subtractWeeks(weeks) { return this.subtractMilliseconds(Duration.inWeeks(weeks)) } subtractMonths(months) { return this.subtractMilliseconds(Duration.inMonths(months)) } subtractQuarters(quarters) { return this.subtractMilliseconds(Duration.inQuarters(quarters)) } subtractYears(years) { return this.subtractMilliseconds(Duration.inYears(years)) } abs() { this.value = Math.abs(this.value) return this } ceil() { this.value = Math.ceil(this.value) return this } floor() { this.value = Math.floor(this.value) return this } round() { this.value = Math.round(this.value) return this } reset() { return this.setValue(0) } clone() { return new UnixTimestamp(this.value) } toTimestamp() { return new Timestamp(this.milliseconds) } toDuration() { return new Duration(this.milliseconds) } toDate() { return new Date(this.milliseconds) } toString(options = {}) { const date = this.toDate().toISOString() return options.millis ? date : date.split('.')[0] + 'Z' } valueOf() { return this.value } toJSON() { return this.value } [Symbol.toPrimitive](hint) { return hint === 'string' ? this.toString() : this.valueOf() } }