From c6c06cf0e8aeefb2e0d8914813e95308e36c4630 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Wed, 20 Dec 2023 14:49:00 -0800 Subject: [PATCH 1/4] Add DateTime::local_unix_epoch --- components/calendar/src/iso.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/components/calendar/src/iso.rs b/components/calendar/src/iso.rs index 9d660b3554c..cf521537c36 100644 --- a/components/calendar/src/iso.rs +++ b/components/calendar/src/iso.rs @@ -286,6 +286,15 @@ impl DateTime { }) } + /// Constructs an ISO datetime representing the UNIX epoch on January 1, 1970 + /// at midnight. + pub fn local_unix_epoch() -> Self { + DateTime { + date: Date::unix_epoch(), + time: types::Time::midnight(), + } + } + /// Minute count representation of calendars starting from 00:00:00 on Jan 1st, 1970. /// /// ```rust From 03410eb775e88109bbc07752c3f30f3b34278fc6 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Thu, 21 Dec 2023 10:25:33 -0800 Subject: [PATCH 2/4] Add to diplomat --- ffi/capi/bindings/c/ICU4XIsoDateTime.h | 2 ++ ffi/capi/bindings/cpp/ICU4XIsoDateTime.h | 2 ++ ffi/capi/bindings/cpp/ICU4XIsoDateTime.hpp | 10 ++++++++++ ffi/capi/bindings/dart/IsoDateTime.g.dart | 13 +++++++++++++ ffi/capi/bindings/js/ICU4XIsoDateTime.d.ts | 8 ++++++++ ffi/capi/bindings/js/ICU4XIsoDateTime.mjs | 4 ++++ ffi/capi/src/datetime.rs | 8 ++++++++ 7 files changed, 47 insertions(+) diff --git a/ffi/capi/bindings/c/ICU4XIsoDateTime.h b/ffi/capi/bindings/c/ICU4XIsoDateTime.h index 404cbfedc86..827c5a3b8bd 100644 --- a/ffi/capi/bindings/c/ICU4XIsoDateTime.h +++ b/ffi/capi/bindings/c/ICU4XIsoDateTime.h @@ -31,6 +31,8 @@ diplomat_result_box_ICU4XIsoDateTime_ICU4XError ICU4XIsoDateTime_create(int32_t ICU4XIsoDateTime* ICU4XIsoDateTime_crate_from_date_and_time(const ICU4XIsoDate* date, const ICU4XTime* time); +ICU4XIsoDateTime* ICU4XIsoDateTime_local_unix_epoch(); + ICU4XIsoDateTime* ICU4XIsoDateTime_create_from_minutes_since_local_unix_epoch(int32_t minutes); ICU4XIsoDate* ICU4XIsoDateTime_date(const ICU4XIsoDateTime* self); diff --git a/ffi/capi/bindings/cpp/ICU4XIsoDateTime.h b/ffi/capi/bindings/cpp/ICU4XIsoDateTime.h index 404cbfedc86..827c5a3b8bd 100644 --- a/ffi/capi/bindings/cpp/ICU4XIsoDateTime.h +++ b/ffi/capi/bindings/cpp/ICU4XIsoDateTime.h @@ -31,6 +31,8 @@ diplomat_result_box_ICU4XIsoDateTime_ICU4XError ICU4XIsoDateTime_create(int32_t ICU4XIsoDateTime* ICU4XIsoDateTime_crate_from_date_and_time(const ICU4XIsoDate* date, const ICU4XTime* time); +ICU4XIsoDateTime* ICU4XIsoDateTime_local_unix_epoch(); + ICU4XIsoDateTime* ICU4XIsoDateTime_create_from_minutes_since_local_unix_epoch(int32_t minutes); ICU4XIsoDate* ICU4XIsoDateTime_date(const ICU4XIsoDateTime* self); diff --git a/ffi/capi/bindings/cpp/ICU4XIsoDateTime.hpp b/ffi/capi/bindings/cpp/ICU4XIsoDateTime.hpp index a76acf89918..c9807c2f27b 100644 --- a/ffi/capi/bindings/cpp/ICU4XIsoDateTime.hpp +++ b/ffi/capi/bindings/cpp/ICU4XIsoDateTime.hpp @@ -52,6 +52,13 @@ class ICU4XIsoDateTime { */ static ICU4XIsoDateTime crate_from_date_and_time(const ICU4XIsoDate& date, const ICU4XTime& time); + /** + * Creates a new [`ICU4XIsoDateTime`] of midnight on January 1, 1970 + * + * See the [Rust documentation for `local_unix_epoch`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.local_unix_epoch) for more information. + */ + static ICU4XIsoDateTime local_unix_epoch(); + /** * Construct from the minutes since the local unix epoch for this date (Jan 1 1970, 00:00) * @@ -225,6 +232,9 @@ inline diplomat::result ICU4XIsoDateTime::create(i inline ICU4XIsoDateTime ICU4XIsoDateTime::crate_from_date_and_time(const ICU4XIsoDate& date, const ICU4XTime& time) { return ICU4XIsoDateTime(capi::ICU4XIsoDateTime_crate_from_date_and_time(date.AsFFI(), time.AsFFI())); } +inline ICU4XIsoDateTime ICU4XIsoDateTime::local_unix_epoch() { + return ICU4XIsoDateTime(capi::ICU4XIsoDateTime_local_unix_epoch()); +} inline ICU4XIsoDateTime ICU4XIsoDateTime::create_from_minutes_since_local_unix_epoch(int32_t minutes) { return ICU4XIsoDateTime(capi::ICU4XIsoDateTime_create_from_minutes_since_local_unix_epoch(minutes)); } diff --git a/ffi/capi/bindings/dart/IsoDateTime.g.dart b/ffi/capi/bindings/dart/IsoDateTime.g.dart index 09492956fcc..1c22e0ad507 100644 --- a/ffi/capi/bindings/dart/IsoDateTime.g.dart +++ b/ffi/capi/bindings/dart/IsoDateTime.g.dart @@ -48,6 +48,19 @@ final class IsoDateTime implements ffi.Finalizable { _capi Function(ffi.Pointer, ffi.Pointer)>>('ICU4XIsoDateTime_crate_from_date_and_time') .asFunction Function(ffi.Pointer, ffi.Pointer)>(isLeaf: true); + /// Creates a new [`IsoDateTime`] of midnight on January 1, 1970 + /// + /// See the [Rust documentation for `local_unix_epoch`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.local_unix_epoch) for more information. + factory IsoDateTime.localUnixEpoch() { + final result = _ICU4XIsoDateTime_local_unix_epoch(); + return IsoDateTime._(result); + } + + // ignore: non_constant_identifier_names + static final _ICU4XIsoDateTime_local_unix_epoch = + _capi Function()>>('ICU4XIsoDateTime_local_unix_epoch') + .asFunction Function()>(isLeaf: true); + /// Construct from the minutes since the local unix epoch for this date (Jan 1 1970, 00:00) /// /// See the [Rust documentation for `from_minutes_since_local_unix_epoch`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.from_minutes_since_local_unix_epoch) for more information. diff --git a/ffi/capi/bindings/js/ICU4XIsoDateTime.d.ts b/ffi/capi/bindings/js/ICU4XIsoDateTime.d.ts index ebf1d5f8d2f..e3b1fa95b9d 100644 --- a/ffi/capi/bindings/js/ICU4XIsoDateTime.d.ts +++ b/ffi/capi/bindings/js/ICU4XIsoDateTime.d.ts @@ -34,6 +34,14 @@ export class ICU4XIsoDateTime { */ static crate_from_date_and_time(date: ICU4XIsoDate, time: ICU4XTime): ICU4XIsoDateTime; + /** + + * Creates a new {@link ICU4XIsoDateTime `ICU4XIsoDateTime`} of midnight on January 1, 1970 + + * See the {@link https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.local_unix_epoch Rust documentation for `local_unix_epoch`} for more information. + */ + static local_unix_epoch(): ICU4XIsoDateTime; + /** * Construct from the minutes since the local unix epoch for this date (Jan 1 1970, 00:00) diff --git a/ffi/capi/bindings/js/ICU4XIsoDateTime.mjs b/ffi/capi/bindings/js/ICU4XIsoDateTime.mjs index e13ffb666ab..40af8243639 100644 --- a/ffi/capi/bindings/js/ICU4XIsoDateTime.mjs +++ b/ffi/capi/bindings/js/ICU4XIsoDateTime.mjs @@ -43,6 +43,10 @@ export class ICU4XIsoDateTime { return new ICU4XIsoDateTime(wasm.ICU4XIsoDateTime_crate_from_date_and_time(arg_date.underlying, arg_time.underlying), true, []); } + static local_unix_epoch() { + return new ICU4XIsoDateTime(wasm.ICU4XIsoDateTime_local_unix_epoch(), true, []); + } + static create_from_minutes_since_local_unix_epoch(arg_minutes) { return new ICU4XIsoDateTime(wasm.ICU4XIsoDateTime_create_from_minutes_since_local_unix_epoch(arg_minutes), true, []); } diff --git a/ffi/capi/src/datetime.rs b/ffi/capi/src/datetime.rs index 220309877ff..00e01dfed59 100644 --- a/ffi/capi/src/datetime.rs +++ b/ffi/capi/src/datetime.rs @@ -55,6 +55,14 @@ pub mod ffi { Box::new(ICU4XIsoDateTime(dt)) } + /// Creates a new [`ICU4XIsoDateTime`] of midnight on January 1, 1970 + #[diplomat::rust_link(icu::calendar::DateTime::local_unix_epoch, FnInStruct)] + pub fn local_unix_epoch( + ) -> Box { + let dt = DateTime::local_unix_epoch(); + Box::new(ICU4XIsoDateTime(dt)) + } + /// Construct from the minutes since the local unix epoch for this date (Jan 1 1970, 00:00) #[diplomat::rust_link( icu::calendar::DateTime::from_minutes_since_local_unix_epoch, From df8ff5aff5db5a5733b1a5afa89f6e287c09330f Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Thu, 21 Dec 2023 10:26:39 -0800 Subject: [PATCH 3/4] Add to CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b88339299b..8627752dc39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ## Unreleased - Components + - `icu_calendar` + - New `DateTime::local_unix_epoch()` convenience constructor (https://github.com/unicode-org/icu4x/pull/4479) - `icu_properties` - Add `Aran` script code (https://github.com/unicode-org/icu4x/pull/4426) - Data model and providers From b7f24e92afa8bcf381ef9fb10bbe1124115f8267 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Thu, 21 Dec 2023 10:28:49 -0800 Subject: [PATCH 4/4] fmt --- ffi/capi/src/datetime.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ffi/capi/src/datetime.rs b/ffi/capi/src/datetime.rs index 00e01dfed59..42a24c87e49 100644 --- a/ffi/capi/src/datetime.rs +++ b/ffi/capi/src/datetime.rs @@ -57,8 +57,7 @@ pub mod ffi { /// Creates a new [`ICU4XIsoDateTime`] of midnight on January 1, 1970 #[diplomat::rust_link(icu::calendar::DateTime::local_unix_epoch, FnInStruct)] - pub fn local_unix_epoch( - ) -> Box { + pub fn local_unix_epoch() -> Box { let dt = DateTime::local_unix_epoch(); Box::new(ICU4XIsoDateTime(dt)) }