-
Notifications
You must be signed in to change notification settings - Fork 362
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b14835b
commit fa31c03
Showing
7 changed files
with
121 additions
and
26 deletions.
There are no files selected for viewing
This file contains 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
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
import dateFormat from "dateformat"; | ||
import { JulianDate } from "terriajs-cesium"; | ||
import DiscretelyTimeVaryingMixin from "../ModelMixins/DiscretelyTimeVaryingMixin"; | ||
|
||
/** | ||
* Returns the offset in minutes from UTC for a given timeZone string. | ||
* @param timeZone - String in the format +/-HH:MM or +/-HH offset from UTC Zulu time. | ||
* @returns The offset in minutes from UTC. as a number. | ||
*/ | ||
|
||
export function getOffsetMinutes(timeZone: string): number { | ||
// use a regex to check if timeZone is in format +/-HH:MM | ||
const regexHHMM = new RegExp(/^([+-])(\d{2}):(\d{2})$/); | ||
const match = timeZone.match(regexHHMM); | ||
|
||
if (match) { | ||
const sign = match[1] === "-" ? -1 : 1; | ||
const hours = parseInt(match[2], 10); | ||
const minutes = parseInt(match[3], 10); | ||
return sign * (hours * 60 + minutes); | ||
} else { | ||
// use a regex to check if timeZone is in format +/-HH | ||
const regexHH = new RegExp(/^([+-])(\d{2})$/); | ||
const match = timeZone.match(regexHH); | ||
if (match) { | ||
const sign = match[1] === "-" ? -1 : 1; | ||
const hours = parseInt(match[2], 10); | ||
return sign * hours * 60; | ||
} else { | ||
return 0; | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* Returns the adjusted time for a given ctalog item. Uses the traits from | ||
* DateTimeTraits.ts to determine how to adjust the date/time. | ||
* timeZone trait: is in the format +/-HH:MM or +/-HH offset from UTC Zulu time. | ||
* dateFormat trait: defines the display format of the time, see | ||
* https://github.com/felixge/node-dateformat for explanation of available formats. | ||
* isStaticDate: trait is a boolean that determines whether to adjust the time to the | ||
* users local time. if true, the time is not transformed to the local time. | ||
* @param item - DiscretelyTimeVaryingMixin.Instance being loaded into workbench. | ||
* @returns The adjusted time as string. | ||
*/ | ||
|
||
export function getAdjustedTime( | ||
item: DiscretelyTimeVaryingMixin.Instance | ||
): string { | ||
if (!item.currentDiscreteJulianDate) { | ||
return ""; | ||
} | ||
|
||
let time = JulianDate.toDate(item.currentDiscreteJulianDate); | ||
|
||
if (item.timeZone) { | ||
const offset = getOffsetMinutes(item.timeZone); | ||
time = JulianDate.toDate( | ||
JulianDate.addMinutes( | ||
item.currentDiscreteJulianDate, | ||
offset, | ||
new JulianDate() | ||
) | ||
); | ||
} | ||
|
||
if (item.isStaticDate) { | ||
time = new Date(time.getTime() + time.getTimezoneOffset() * 60 * 1000); | ||
} | ||
|
||
const format = item.dateFormat || "isoDate"; | ||
return dateFormat(time, format); | ||
} |
This file contains 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
This file contains 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
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import ModelTraits from "../ModelTraits"; | ||
import primitiveTrait from "../Decorators/primitiveTrait"; | ||
|
||
export class DateTimeTraits extends ModelTraits { | ||
@primitiveTrait({ | ||
type: "string", | ||
name: "Timezone", | ||
description: | ||
"If the DateTime attribute values do not have timezone information" + | ||
" (e.g. 2018-01-01T00:00:00), specify the ISO timezone with offset from UTC (e.g. +10:00)" | ||
}) | ||
timeZone?: string; | ||
|
||
@primitiveTrait({ | ||
type: "string", | ||
name: "Date format", | ||
description: | ||
"See available formats here https://github.com/felixge/node-dateformat" | ||
}) | ||
dateFormat?: string; | ||
|
||
@primitiveTrait({ | ||
type: "boolean", | ||
name: "Static date", | ||
description: "Do not transform date/time values to users local time." | ||
}) | ||
isStaticDate?: boolean; | ||
} | ||
|
||
export default DateTimeTraits; |
This file contains 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
This file contains 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