Created
April 28, 2020 08:02
-
-
Save tatat/142889d3067974c79b13cc1931b82715 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
これ実行は
TZ=UTC node ./vdate.ts