blob: 00d6de7d38d0dd3fa04f6644796868e60d73b564 [file] [log] [blame]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:js_interop';
/// The JS [`Date`] type.
///
/// [`Date`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
@JS('Date')
extension type JSDate._(JSObject _) implements JSObject {
/// The [Date constructor] that returns the current date and time.
///
/// [Date constructor]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
external JSDate.nowAsDate();
/// The [Date constructor] with the number of milliseconds since the epoch of
/// January 1, 1970, UTC.
///
/// [Date constructor]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date#time_value_or_timestamp_number
external JSDate.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch);
/// The [Date constructor] that parses its value [from a string].
///
/// [Date constructor]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
/// [from a string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date#date_string
external JSDate.parseAsDate(String dateString);
/// The [Date constructor] that copies its value [from an existing Date].
///
/// [Date constructor]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
/// [from an existing Date]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date#date_object
external JSDate.from(JSDate other);
/// The [Date constructor] that uses [individual component integers],
/// interpreted in the local time zone.
///
/// [Date constructor]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
/// [individual component integers]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date#individual_date_and_time_component_values
external JSDate.localDate(
int year,
int month, [
int? day,
int? hours,
int? minutes,
int? seconds,
int? milliseconds,
]);
/// The [Date constructor] that uses [individual component integers],
/// interpreted in the UTC time zone.
///
/// [Date constructor]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
/// [individual component integers]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date#individual_date_and_time_component_values
factory JSDate.utcDate(
int year,
int month, [
int? day,
int? hours,
int? minutes,
int? seconds,
int? milliseconds,
]) {
var ms = switch ((day, hours, minutes, seconds, milliseconds)) {
(_, _, _, _, var milliseconds?) => JSDate.utcAsMillisecondsSinceEpoch(
year,
month,
day,
hours,
minutes,
seconds,
milliseconds,
),
(_, _, _, var seconds?, _) => JSDate.utcAsMillisecondsSinceEpoch(
year,
month,
day,
hours,
minutes,
seconds,
),
(_, _, var minutes?, _, _) => JSDate.utcAsMillisecondsSinceEpoch(
year,
month,
day,
hours,
minutes,
),
(_, var hours?, _, _, _) => JSDate.utcAsMillisecondsSinceEpoch(
year,
month,
day,
hours,
),
(var day?, _, _, _, _) => JSDate.utcAsMillisecondsSinceEpoch(
year,
month,
day,
),
_ => JSDate.utcAsMillisecondsSinceEpoch(year, month),
};
return JSDate.fromMillisecondsSinceEpoch(ms);
}
/// Dee [`Date.now()`].
///
/// [`Date.now()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now
@JS('now')
external static int nowAsMillisecondsSinceEpoch();
/// See [`Date.parse()`].
///
/// [`Date.parse()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
@JS('parse')
external static int parseAsMillisecondsSinceEpoch(String dateString);
/// The [`Date.utc()`] function.
///
/// [`Date.utc()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC
@JS('UTC')
external static int utcAsMillisecondsSinceEpoch(
int year, [
int? month,
int? day,
int? hours,
int? minutes,
int? seconds,
int? milliseconds,
]);
/// See [`Date.getDate()`] and [`Date.setDate()`].
///
/// [`Date.getDate()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDate
/// [`Date.setDate()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate
int get date => _getDate();
set date(int value) => _setDate(value);
@JS('getDate')
external int _getDate();
@JS('setDate')
external void _setDate(int value);
/// See [`Date.getDay()`] and [`Date.setDay()`].
///
/// [`Date.getDay()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay
/// [`Date.setDay()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDay
int get day => _getDay();
@JS('getDay')
external int _getDay();
/// See [`Date.getFullYear()`] and [`Date.setFullYear()`].
///
/// [`Date.getFullYear()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear
/// [`Date.setFullYear()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear
int get fullYear => _getFullYear();
set fullYear(int value) => _setFullYear(value);
@JS('getFullYear')
external int _getFullYear();
@JS('setFullYear')
external void _setFullYear(int value);
/// See [`Date.getHours()`] and [`Date.setHours()`].
///
/// [`Date.getHours()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getHours
/// [`Date.setHours()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setHours
int get hours => _getHours();
set hours(int value) => _setHours(value);
@JS('getHours')
external int _getHours();
@JS('setHours')
external void _setHours(int value);
/// See [`Date.getMilliseconds()`] and [`Date.setMilliseconds()`].
///
/// [`Date.getMilliseconds()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMilliseconds
/// [`Date.setMilliseconds()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMilliseconds
int get milliseconds => _getMilliseconds();
set milliseconds(int value) => _setMilliseconds(value);
@JS('getMilliseconds')
external int _getMilliseconds();
@JS('setMilliseconds')
external void _setMilliseconds(int value);
/// See [`Date.getMinutes()`] and [`Date.setMinutes()`].
///
/// [`Date.getMinutes()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMinutes
/// [`Date.setMinutes()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMinutes
int get minutes => _getMinutes();
set minutes(int value) => _setMinutes(value);
@JS('getMinutes')
external int _getMinutes();
@JS('setMinutes')
external void _setMinutes(int value);
/// See [`Date.getMonth()`] and [`Date.setMonth()`].
///
/// [`Date.getMonth()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth
/// [`Date.setMonth()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth
int get month => _getMonth();
set month(int value) => _setMonth(value);
@JS('getMonth')
external int _getMonth();
@JS('setMonth')
external void _setMonth(int value);
/// See [`Date.getSeconds()`] and [`Date.setSeconds()`].
///
/// [`Date.getSeconds()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getSeconds
/// [`Date.setSeconds()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setSeconds
int get seconds => _getSeconds();
set seconds(int value) => _setSeconds(value);
@JS('getSeconds')
external int _getSeconds();
@JS('setSeconds')
external void _setSeconds(int value);
/// See [`Date.getTime()`] and [`Date.setTime()`].
///
/// [`Date.getTime()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime
/// [`Date.setTime()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setTime
int get time => _getTime();
set time(int value) => _setTime(value);
@JS('getTime')
external int _getTime();
@JS('setTime')
external void _setTime(int value);
/// See [`Date.getTimezoneOffset()`].
///
/// [`Date.getTimezoneOffset()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
int get timezoneOffset => _getTimezoneOffset();
@JS('getTimezoneOffset')
external int _getTimezoneOffset();
/// See [`Date.getUTCDate()`] and [`Date.setUTCDate()`].
///
/// [`Date.getUTCDate()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDate
/// [`Date.setUTCDate()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCDate
int get utcDate => _getUtcDate();
set utcDate(int value) => _setUtcDate(value);
@JS('getUTCDate')
external int _getUtcDate();
@JS('setUTCDate')
external void _setUtcDate(int value);
/// See [`Date.getUTCFullYear()`] and [`Date.setUTCFullYear()`].
///
/// [`Date.getUTCFullYear()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCFullYear
/// [`Date.setUTCFullYear()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear
int get utcFullYear => _getUtcFullYear();
set utcFullYear(int value) => _setUtcFullYear(value);
@JS('getUTCFullYear')
external int _getUtcFullYear();
@JS('setUTCFullYear')
external void _setUtcFullYear(int value);
/// See [`Date.getUTCHours()`] and [`Date.setUTCHours()`].
///
/// [`Date.getUTCHours()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCHours
/// [`Date.setUTCHours()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCHours
int get utcHours => _getUtcHours();
set utcHours(int value) => _setUtcHours(value);
@JS('getUTCHours')
external int _getUtcHours();
@JS('setUTCHours')
external void _setUtcHours(int value);
/// See [`Date.getUTCMilliseconds()`] and [`Date.setUTCMilliseconds()`].
///
/// [`Date.getUTCMilliseconds()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMilliseconds
/// [`Date.setUTCMilliseconds()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMilliseconds
int get utcMilliseconds => _getUtcMilliseconds();
set utcMilliseconds(int value) => _setUtcMilliseconds(value);
@JS('getUTCMilliseconds')
external int _getUtcMilliseconds();
@JS('setUTCMilliseconds')
external void _setUtcMilliseconds(int value);
/// See [`Date.getUTCMinutes()`] and [`Date.setUTCMinutes()`].
///
/// [`Date.getUTCMinutes()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMinutes
/// [`Date.setUTCMinutes()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMinutes
int get utcMinutes => _getUtcMinutes();
set utcMinutes(int value) => _setUtcMinutes(value);
@JS('getUTCMinutes')
external int _getUtcMinutes();
@JS('setUTCMinutes')
external void _setUtcMinutes(int value);
/// See [`Date.getUTCMonth()`] and [`Date.setUTCMonth()`].
///
/// [`Date.getUTCMonth()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMonth
/// [`Date.setUTCMonth()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMonth
int get utcMonth => _getUtcMonth();
set utcMonth(int value) => _setUtcMonth(value);
@JS('getUTCMonth')
external int _getUtcMonth();
@JS('setUTCMonth')
external void _setUtcMonth(int value);
/// See [`Date.getUTCSeconds()`] and [`Date.setUTCSeconds()`].
///
/// [`Date.getUTCSeconds()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCSeconds
/// [`Date.setUTCSeconds()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds
int get utcSeconds => _getUtcSeconds();
set utcSeconds(int value) => _setUtcSeconds(value);
@JS('getUTCSeconds')
external int _getUtcSeconds();
@JS('setUTCSeconds')
external void _setUtcSeconds(int value);
/// See [`Date.toDateString()`].
///
/// [`Date.toDateString()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toDateString
external String toDateString();
/// See [`Date.toDateString()`].
///
/// [`Date.toDateString()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toDateString
@JS('toISOString')
external String toIsoString();
// TODO - Add `toLocale*String` when Intl.DateTimeFormat is fully typed.
/// See [`Date.toTimeString()`].
///
/// [`Date.toTimeString()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toTimeString
external String toTimeString();
/// See [`Date.toUTCString()`].
///
/// [`Date.toUTCString()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString
@JS('toUTCString')
external String toUtcString();
/// Converts this to a Dart [DateTime] that represents the same point in time
/// in the local time zone.
DateTime get toDart => DateTime.fromMillisecondsSinceEpoch(time);
/// Converts this to a Dart [DateTime] that represents the same point in time
/// in the UTC time zone.
DateTime get toDartUtc =>
DateTime.fromMillisecondsSinceEpoch(time, isUtc: true);
}