diff --git a/README.md b/README.md
index ea07a0f..0457ab2 100644
--- a/README.md
+++ b/README.md
@@ -5,14 +5,22 @@ in ~100 LoC. For Node.js & Browsers.
[![](./xtz-preview.png)](https://therootcompany.github.io/tz.js/)
-XTZ is a poor man's `Temporal` polyfill, but just for time zones. \
+XTZ is a poor man's `Temporal` polyfill, but just for timezones. \
Demo:
> What UTC time will it be when it's 3:15am in New York?
+```js
+TZ.toISOString("2021-11-07 03:15:59.000", "UTC", "America/New_York");
+TZ.toISOString("2021-11-07 03:15:59.000", "America/New_York", "UTC");
+TZ.toISOString("2021-11-07 03:15:59.000", "America/New_York");
+TZ.toISOString("2021-11-07T03:15:59.000Z", "America/New_York");
+TZ.toISOString("2021-11-07 03:15:59.000", "America/New_York", "America/Denver");
+```
+
```js
// Relative New York time to Absolute UTC Time
-TZ.toUTCISOString("2021-11-07 03:15:59.000", "America/New_York");
+TZ.toISOString("2021-11-07 03:15:59.000", "America/New_York");
// "2021-11-07T03:15:59.000-0500"
```
@@ -33,7 +41,7 @@ tzDate.toISOString();
```js
// Absolute UTC time to Relative New York time
-TZ.toTimeZoneISOString("2021-03-14T07:15:59.000Z", "America/New_York");
+TZ.toISOString("2021-03-14 07:15:59.000", "UTC", "America/New_York");
// "2021-03-14T03:15:59.000-0400"
```
@@ -89,12 +97,12 @@ See .
# API
-- `toTimeZone(utcDate, timeZone)`
-- `toTimeZoneISOString(isoString, timeZone)`
-- `toUTC(dtString, timeZone)`
-- `toUTCISOString(dtString, timeZone)`
+- `toTimeZone(utcDate, outputZone)`
+- `toTimeZoneISOString(isoString, outputZone)`
+- `toUTC(dtString, inputZone)`
+- `toUTCISOString(dtString, inputZone)`
-## `toTimeZone(utcDate, timeZone)`
+## `toTimeZone(utcDate, outputZone)`
> Convert UTC into a Target Time Zone
@@ -138,7 +146,7 @@ new Date("2021-11-07T03:15:59.000-0500").toISOString());
// "2021-11-07T08:15:59.000Z"
```
-## `toUTC(dtString, timeZone)`
+## `toUTC(dtString, outputZone)`
> Convert a Target Time Zone into UTC
diff --git a/test.js b/test.js
index acd4ea7..4098d19 100644
--- a/test.js
+++ b/test.js
@@ -25,8 +25,26 @@ function testTzToUtc(t) {
}
}
+function testTzToTz(t) {
+ var result = TZ.translate.apply(TZ, t.inputs);
+ if (t.result !== result.toISOString()) {
+ console.log(result);
+ throw new Error(
+ `Invalid TZ to TZ conversion for ${t.desc}:\n` +
+ `\tExpected: ${t.result}\n` +
+ `\tActual: ${result.toISOString()}\n`
+ );
+ }
+}
+
// At this real UTC time, what does the timezone translate it to?
[
+ {
+ desc: "UTC Identity (1)",
+ inputs: ["2021-03-14T05:15:59.000Z", "UTC"],
+ result: "2021-03-14T05:15:59.000Z",
+ },
+
//
// Start-of-DST Tests
//
@@ -190,6 +208,12 @@ function testTzToUtc(t) {
console.info("Pass: UTC to TZ for America/New_York and Asia/Colombo");
[
+ {
+ desc: "UTC Identity (2)",
+ inputs: ["2021-03-14 05:15:59.000", "UTC"],
+ result: "2021-03-14T05:15:59.000Z",
+ },
+
//
// Start-of-DST Tests
//
@@ -314,3 +338,36 @@ console.info("Pass: UTC to TZ for America/New_York and Asia/Colombo");
},
].forEach(testTzToUtc);
console.info("Pass: TZ to UTC for America/New_York and Asia/Colombo");
+
+[
+ {
+ desc: "(Xa) UTC Identity",
+ inputs: ["2021-03-14 05:15:59.000", "UTC", "UTC"],
+ result: "2021-03-14T05:15:59.000Z",
+ },
+ {
+ desc: "(Xb) UTC to 12:15am NY EST",
+ inputs: ["2021-03-14 05:15:59.000", "UTC", "America/New_York"],
+ result: "2021-03-14T00:15:59.000-0500",
+ },
+ {
+ desc: "(Xc) 2021 Mar 14, 12:15am NY EST to UTC",
+ inputs: ["2021-03-14 00:15:59.000", "America/New_York", "UTC"],
+ result: "2021-03-14T05:15:59.000Z",
+ },
+ {
+ desc: "(Xd) Asia/Colombo to America/New_York",
+ // 2021-11-07T13:45:59.000+0530
+ // to 2021-11-07T03:15:59.000-0500
+ inputs: ["2021-11-07 13:45:59.000", "Asia/Colombo", "America/New_York"],
+ result: "2021-11-07T03:15:59.000-0500",
+ },
+ {
+ desc: "(Xe) America/New_York to Asia/Colombo",
+ // 2021-11-07T03:15:59.000-0500
+ // to 2021-11-07T13:45:59.000+0530
+ inputs: ["2021-11-07 03:15:59.000", "America/New_York", "Asia/Colombo"],
+ result: "2021-11-07T13:45:59.000+0530",
+ },
+].forEach(testTzToTz);
+console.info("Pass: TZ to TZ for America/New_York, UTC, and Asia/Colombo");
diff --git a/xtz.js b/xtz.js
index feb36f0..8ced8c1 100644
--- a/xtz.js
+++ b/xtz.js
@@ -126,6 +126,9 @@ var XTZ;
}
var utcDate = new Date(dt);
var tzD2 = toTimeZone(utcDate, tz);
+ if ("UTC" === tz) {
+ return tzD2;
+ }
var offset = tzD2.offset;
tzD2.offset = 0;
@@ -155,6 +158,18 @@ var XTZ;
return toOffsetISOString(whole);
}
+ function translate(dt, tz, tz2) {
+ var utc = new Date(toUTC(dt, tz).toISOString());
+ if (!tz2) {
+ return utc;
+ }
+ return toTimeZone(utc, tz2);
+ }
+
+ function toISOString(dt, tz, tz2) {
+ return translate(dt, tz, tz2).toISOString();
+ }
+
XTZ = {
// bespoke date =>
// 2021-11-07T3:15:59-0500
@@ -172,6 +187,10 @@ var XTZ;
// => "2021-11-07T03:15:59-0500" // 2021-11-07T08:15:59Z
toUTC: toUTC,
toUTCISOString: toUTCISOString,
+
+ toISOString: toISOString,
+
+ translate: translate,
};
if ("undefined" != typeof module && module.exports) {