From c0e5befa764c5ac987c7bf109ad56c3896bf5fb0 Mon Sep 17 00:00:00 2001 From: Chris Wilkinson Date: Tue, 4 Feb 2025 00:42:34 +0000 Subject: [PATCH] Make it easy to convert a DateTime.Zoned to a DateTime.Utc (#4375) --- .changeset/sixty-mice-occur.md | 5 +++++ packages/effect/src/DateTime.ts | 17 +++++++++++++++++ packages/effect/src/internal/dateTime.ts | 3 +++ packages/effect/test/DateTime.test.ts | 17 +++++++++++++++++ packages/platform-node/test/HttpApi.test.ts | 2 +- 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 .changeset/sixty-mice-occur.md diff --git a/.changeset/sixty-mice-occur.md b/.changeset/sixty-mice-occur.md new file mode 100644 index 00000000000..b339204d760 --- /dev/null +++ b/.changeset/sixty-mice-occur.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +Make it easy to convert a DateTime.Zoned to a DateTime.Utc diff --git a/packages/effect/src/DateTime.ts b/packages/effect/src/DateTime.ts index d50d1bd0241..efe8166d22a 100644 --- a/packages/effect/src/DateTime.ts +++ b/packages/effect/src/DateTime.ts @@ -437,6 +437,23 @@ export const unsafeNow: LazyArg = Internal.unsafeNow // time zones // ============================================================================= +/** + * For a `DateTime` returns a new `DateTime.Utc`. + * + * @since 3.13.0 + * @category time zones + * @example + * ```ts + * import { DateTime } from "effect" + * + * const now = DateTime.unsafeMakeZoned({ year: 2024 }, { timeZone: "Europe/London" }) + * + * // set as UTC + * const utc: DateTime.Utc = DateTime.toUtc(now) + * ``` + */ +export const toUtc: (self: DateTime) => Utc = Internal.toUtc + /** * Set the time zone of a `DateTime`, returning a new `DateTime.Zoned`. * diff --git a/packages/effect/src/internal/dateTime.ts b/packages/effect/src/internal/dateTime.ts index 0256bc3b728..e9a0538a8a3 100644 --- a/packages/effect/src/internal/dateTime.ts +++ b/packages/effect/src/internal/dateTime.ts @@ -306,6 +306,9 @@ export const unsafeNow: LazyArg = () => makeUtc(Date.now()) // time zones // ============================================================================= +/** @internal */ +export const toUtc = (self: DateTime.DateTime): DateTime.Utc => makeUtc(self.epochMillis) + /** @internal */ export const setZone: { (zone: DateTime.TimeZone, options?: { diff --git a/packages/effect/test/DateTime.test.ts b/packages/effect/test/DateTime.test.ts index ca478cff990..04fd7eeb19f 100644 --- a/packages/effect/test/DateTime.test.ts +++ b/packages/effect/test/DateTime.test.ts @@ -421,4 +421,21 @@ describe("DateTime", () => { const dt = DateTime.unsafeMakeZoned(date) deepStrictEqual(dt.zone, DateTime.zoneMakeOffset(60 * 60 * 1000)) }) + + describe("toUtc", () => { + it.effect("with a Utc", () => + Effect.gen(function*() { + const dt = DateTime.unsafeMake("2024-01-01T01:00:00") + strictEqual(dt.toJSON(), "2024-01-01T01:00:00.000Z") + })) + + it.effect("with a Zoned", () => + Effect.gen(function*() { + const dt = DateTime.unsafeMakeZoned("2024-01-01T01:00:00Z", { + timeZone: "Pacific/Auckland", + adjustForTimeZone: true + }) + strictEqual(dt.toJSON(), "2023-12-31T12:00:00.000Z") + })) + }) }) diff --git a/packages/platform-node/test/HttpApi.test.ts b/packages/platform-node/test/HttpApi.test.ts index 7d92efced4c..5278ed2eae0 100644 --- a/packages/platform-node/test/HttpApi.test.ts +++ b/packages/platform-node/test/HttpApi.test.ts @@ -445,7 +445,7 @@ const HttpUsersLive = HttpApiBuilder.group( new User({ id: 1, name: `page ${_.headers.page}`, - createdAt: DateTime.unsafeMake(now.epochMillis) + createdAt: DateTime.toUtc(now) }) ])) .handle("upload", (_) =>