Skip to content

Instantly share code, notes, and snippets.

@tatat
Created April 28, 2020 08:02
Show Gist options
  • Save tatat/142889d3067974c79b13cc1931b82715 to your computer and use it in GitHub Desktop.
Save tatat/142889d3067974c79b13cc1931b82715 to your computer and use it in GitHub Desktop.
type VDate = Date
type VDateContext = {
current: (actualBase?: Date) => VDate;
toVirtual: (date: Date) => VDate;
toActual: (date: VDate) => Date;
mapToVirtual: (date: Date, actualBase?: Date) => VDate;
}
const createContext = (factor: number, _virtualBase?: Date): VDateContext => {
const virtualBase = _virtualBase ?? new Date(new Date().getFullYear(), 0, 1)
if (factor === 1) {
const clone = (date: Date) => new Date(date.getTime())
return {
current: (actualBase) => actualBase ?? new Date(),
toVirtual: clone,
toActual: clone,
mapToVirtual: clone,
}
}
const toVirtual = (d: Date) => new Date(virtualBase.getTime() + (d.getTime() - virtualBase.getTime()) * factor)
const toActual = (d: Date) => new Date(virtualBase.getTime() + (d.getTime() - virtualBase.getTime()) / factor)
const mapToVirtual = (d: Date, actualBase?: Date) => {
const base = actualBase ?? new Date()
const diff = d.getTime() - base.getTime()
return new Date(toVirtual(base).getTime() + diff)
}
return {
current: (actualBase) => toVirtual(actualBase ?? new Date()),
toVirtual,
toActual,
mapToVirtual
}
}
const context = createContext(3600)
// 2020-04-28T00:00:00.000Z
const current = new Date(2020, 3, 28)
console.log('Current:', current.toISOString())
// 2020-04-28T01:00:00.000Z
const date = new Date(current.getTime() + 60 * 60 * 1000)
console.log('Target: ', date.toISOString())
// 3183-01-24T01:00:00.000Z
const virtual = context.mapToVirtual(date, current)
console.log('Virtual:', virtual.toISOString())
// 2020-04-28T00:00:01.000Z
const actual = context.toActual(virtual)
console.log('Actual: ', actual.toISOString())
@tatat
Copy link
Author

tatat commented Apr 30, 2020

これ実行は TZ=UTC node ./vdate.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment