DateTime copyWith extension
This change has been discussed for 8+ years and it would of course be preferred
to be added as an instance method, but since that is a breaking change I added it as an extension as discussed here:
https://github.com/dart-lang/sdk/issues/24644#issuecomment-1241695835
Change-Id: Iebb9f300e449920ae8891abac88f30b271321661
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/258541
Commit-Queue: Lasse Nielsen <lrn@google.com>
Reviewed-by: Nate Bosch <nbosch@google.com>
Reviewed-by: Lasse Nielsen <lrn@google.com>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2f5350b..c6124da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -56,6 +56,12 @@
### Libraries
+#### `dart:core`
+
+- Added `copyWith` extension method on `DateTime` (see [#24644][]).
+
+[#24644]: https://github.com/dart-lang/sdk/issues/24644
+
#### `dart:convert`
- **Breaking change** [#34233][]: The previously deprecated API
diff --git a/pkg/front_end/test/extensions/data/ambiguous/lib1.dart b/pkg/front_end/test/extensions/data/ambiguous/lib1.dart
index 0ee1710..2491d43 100644
--- a/pkg/front_end/test/extensions/data/ambiguous/lib1.dart
+++ b/pkg/front_end/test/extensions/data/ambiguous/lib1.dart
@@ -7,6 +7,7 @@
AmbiguousExtension2,
UnambiguousExtension1,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/ambiguous/lib2.dart b/pkg/front_end/test/extensions/data/ambiguous/lib2.dart
index 882d2fc..712cdcc 100644
--- a/pkg/front_end/test/extensions/data/ambiguous/lib2.dart
+++ b/pkg/front_end/test/extensions/data/ambiguous/lib2.dart
@@ -7,6 +7,7 @@
AmbiguousExtension2,
UnambiguousExtension2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/ambiguous/main.dart b/pkg/front_end/test/extensions/data/ambiguous/main.dart
index adf03ea..8abf855 100644
--- a/pkg/front_end/test/extensions/data/ambiguous/main.dart
+++ b/pkg/front_end/test/extensions/data/ambiguous/main.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName,
lib1.dart.AmbiguousExtension1,
diff --git a/pkg/front_end/test/extensions/data/as_show/lib.dart b/pkg/front_end/test/extensions/data/as_show/lib.dart
index 56d26bd..52e6a0f 100644
--- a/pkg/front_end/test/extensions/data/as_show/lib.dart
+++ b/pkg/front_end/test/extensions/data/as_show/lib.dart
@@ -5,6 +5,7 @@
/*library: scope=[
Extension1,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/as_show/main.dart b/pkg/front_end/test/extensions/data/as_show/main.dart
index 47a09d2..10e3b7b 100644
--- a/pkg/front_end/test/extensions/data/as_show/main.dart
+++ b/pkg/front_end/test/extensions/data/as_show/main.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName,
lib.dart.Extension1,
diff --git a/pkg/front_end/test/extensions/data/as_show/origin.dart b/pkg/front_end/test/extensions/data/as_show/origin.dart
index b067a10..9de7e2d 100644
--- a/pkg/front_end/test/extensions/data/as_show/origin.dart
+++ b/pkg/front_end/test/extensions/data/as_show/origin.dart
@@ -5,6 +5,7 @@
/*library: scope=[
Extension2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/explicit_this.dart b/pkg/front_end/test/extensions/data/explicit_this.dart
index 8f47acc..4776db5 100644
--- a/pkg/front_end/test/extensions/data/explicit_this.dart
+++ b/pkg/front_end/test/extensions/data/explicit_this.dart
@@ -5,6 +5,7 @@
/*library: scope=[
A2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/export_twice/lib1.dart b/pkg/front_end/test/extensions/data/export_twice/lib1.dart
index c4d9386..d485b0f 100644
--- a/pkg/front_end/test/extensions/data/export_twice/lib1.dart
+++ b/pkg/front_end/test/extensions/data/export_twice/lib1.dart
@@ -5,6 +5,7 @@
/*library: scope=[
E,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/export_twice/lib2.dart b/pkg/front_end/test/extensions/data/export_twice/lib2.dart
index c6b5edb..e4bb85c 100644
--- a/pkg/front_end/test/extensions/data/export_twice/lib2.dart
+++ b/pkg/front_end/test/extensions/data/export_twice/lib2.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/export_twice/main.dart b/pkg/front_end/test/extensions/data/export_twice/main.dart
index 65aa4a0..9dd0fa6 100644
--- a/pkg/front_end/test/extensions/data/export_twice/main.dart
+++ b/pkg/front_end/test/extensions/data/export_twice/main.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName,
lib1.dart.E]*/
diff --git a/pkg/front_end/test/extensions/data/export_unnamed/lib.dart b/pkg/front_end/test/extensions/data/export_unnamed/lib.dart
index 55622e5..f9ebde8 100644
--- a/pkg/front_end/test/extensions/data/export_unnamed/lib.dart
+++ b/pkg/front_end/test/extensions/data/export_unnamed/lib.dart
@@ -6,6 +6,7 @@
NamedExtension,
_extension#1,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/export_unnamed/main.dart b/pkg/front_end/test/extensions/data/export_unnamed/main.dart
index eafdc7d..b8680b3 100644
--- a/pkg/front_end/test/extensions/data/export_unnamed/main.dart
+++ b/pkg/front_end/test/extensions/data/export_unnamed/main.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName,
lib.dart.NamedExtension]*/
diff --git a/pkg/front_end/test/extensions/data/extension_on_type_variable.dart b/pkg/front_end/test/extensions/data/extension_on_type_variable.dart
index baf80b2..f6d3d3a 100644
--- a/pkg/front_end/test/extensions/data/extension_on_type_variable.dart
+++ b/pkg/front_end/test/extensions/data/extension_on_type_variable.dart
@@ -5,6 +5,7 @@
/*library: scope=[
GeneralGeneric,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/implicit_this.dart b/pkg/front_end/test/extensions/data/implicit_this.dart
index a186361..de50910 100644
--- a/pkg/front_end/test/extensions/data/implicit_this.dart
+++ b/pkg/front_end/test/extensions/data/implicit_this.dart
@@ -5,6 +5,7 @@
/*library: scope=[
A2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/instance_members.dart b/pkg/front_end/test/extensions/data/instance_members.dart
index 10c036b..09497f4 100644
--- a/pkg/front_end/test/extensions/data/instance_members.dart
+++ b/pkg/front_end/test/extensions/data/instance_members.dart
@@ -6,6 +6,7 @@
A2,
B2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/named_declarations.dart b/pkg/front_end/test/extensions/data/named_declarations.dart
index 5c08328..c3754d4 100644
--- a/pkg/front_end/test/extensions/data/named_declarations.dart
+++ b/pkg/front_end/test/extensions/data/named_declarations.dart
@@ -8,6 +8,7 @@
B3,
B4,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/other_kinds.dart b/pkg/front_end/test/extensions/data/other_kinds.dart
index 1e1e0a9..0904d2a 100644
--- a/pkg/front_end/test/extensions/data/other_kinds.dart
+++ b/pkg/front_end/test/extensions/data/other_kinds.dart
@@ -5,6 +5,7 @@
/*library: scope=[
A2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/part/main.dart b/pkg/front_end/test/extensions/data/part/main.dart
index f1cb1e9..07e2803 100644
--- a/pkg/front_end/test/extensions/data/part/main.dart
+++ b/pkg/front_end/test/extensions/data/part/main.dart
@@ -6,6 +6,7 @@
Extension,
_extension#1,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/patching/main.dart b/pkg/front_end/test/extensions/data/patching/main.dart
index f53b2a1..aec8f4a 100644
--- a/pkg/front_end/test/extensions/data/patching/main.dart
+++ b/pkg/front_end/test/extensions/data/patching/main.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName,
origin.dart.Extension,
diff --git a/pkg/front_end/test/extensions/data/patching/origin.dart b/pkg/front_end/test/extensions/data/patching/origin.dart
index 34b5cfc..eceebf0 100644
--- a/pkg/front_end/test/extensions/data/patching/origin.dart
+++ b/pkg/front_end/test/extensions/data/patching/origin.dart
@@ -6,6 +6,7 @@
Extension,
GenericExtension,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/prefix/lib1.dart b/pkg/front_end/test/extensions/data/prefix/lib1.dart
index 19d099a..44cbbf4 100644
--- a/pkg/front_end/test/extensions/data/prefix/lib1.dart
+++ b/pkg/front_end/test/extensions/data/prefix/lib1.dart
@@ -6,6 +6,7 @@
HiddenExtension1,
ShownExtension1,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/prefix/lib2.dart b/pkg/front_end/test/extensions/data/prefix/lib2.dart
index dae3ef6..13f7479 100644
--- a/pkg/front_end/test/extensions/data/prefix/lib2.dart
+++ b/pkg/front_end/test/extensions/data/prefix/lib2.dart
@@ -6,6 +6,7 @@
HiddenExtension2,
ShownExtension2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/prefix/lib3.dart b/pkg/front_end/test/extensions/data/prefix/lib3.dart
index f166d1f..1170398 100644
--- a/pkg/front_end/test/extensions/data/prefix/lib3.dart
+++ b/pkg/front_end/test/extensions/data/prefix/lib3.dart
@@ -5,6 +5,7 @@
/*library: scope=[
ShownExtension3,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/prefix/main.dart b/pkg/front_end/test/extensions/data/prefix/main.dart
index a9f5a9d..d6e80e4 100644
--- a/pkg/front_end/test/extensions/data/prefix/main.dart
+++ b/pkg/front_end/test/extensions/data/prefix/main.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName,
lib1.dart.ShownExtension1,
diff --git a/pkg/front_end/test/extensions/data/reexport/lib.dart b/pkg/front_end/test/extensions/data/reexport/lib.dart
index 2b06562..735e569 100644
--- a/pkg/front_end/test/extensions/data/reexport/lib.dart
+++ b/pkg/front_end/test/extensions/data/reexport/lib.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/reexport/lib1.dart b/pkg/front_end/test/extensions/data/reexport/lib1.dart
index cf3ae62..f2a604f 100644
--- a/pkg/front_end/test/extensions/data/reexport/lib1.dart
+++ b/pkg/front_end/test/extensions/data/reexport/lib1.dart
@@ -6,6 +6,7 @@
ClashingExtension,
UniqueExtension1,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/reexport/lib2.dart b/pkg/front_end/test/extensions/data/reexport/lib2.dart
index 3059376..658b2c3 100644
--- a/pkg/front_end/test/extensions/data/reexport/lib2.dart
+++ b/pkg/front_end/test/extensions/data/reexport/lib2.dart
@@ -6,6 +6,7 @@
ClashingExtension,
UniqueExtension2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/reexport/main.dart b/pkg/front_end/test/extensions/data/reexport/main.dart
index 1dfe0ae..1d9a58f 100644
--- a/pkg/front_end/test/extensions/data/reexport/main.dart
+++ b/pkg/front_end/test/extensions/data/reexport/main.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName,
lib1.dart.UniqueExtension1,
diff --git a/pkg/front_end/test/extensions/data/show_hide/lib1.dart b/pkg/front_end/test/extensions/data/show_hide/lib1.dart
index 19d099a..44cbbf4 100644
--- a/pkg/front_end/test/extensions/data/show_hide/lib1.dart
+++ b/pkg/front_end/test/extensions/data/show_hide/lib1.dart
@@ -6,6 +6,7 @@
HiddenExtension1,
ShownExtension1,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/show_hide/lib2.dart b/pkg/front_end/test/extensions/data/show_hide/lib2.dart
index dae3ef6..13f7479 100644
--- a/pkg/front_end/test/extensions/data/show_hide/lib2.dart
+++ b/pkg/front_end/test/extensions/data/show_hide/lib2.dart
@@ -6,6 +6,7 @@
HiddenExtension2,
ShownExtension2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/show_hide/main.dart b/pkg/front_end/test/extensions/data/show_hide/main.dart
index c137caa..8d64be3 100644
--- a/pkg/front_end/test/extensions/data/show_hide/main.dart
+++ b/pkg/front_end/test/extensions/data/show_hide/main.dart
@@ -4,6 +4,7 @@
/*library: scope=[
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName,
lib1.dart.ShownExtension1,
diff --git a/pkg/front_end/test/extensions/data/static_members.dart b/pkg/front_end/test/extensions/data/static_members.dart
index 4f0a7b1..c3a83ab 100644
--- a/pkg/front_end/test/extensions/data/static_members.dart
+++ b/pkg/front_end/test/extensions/data/static_members.dart
@@ -6,6 +6,7 @@
A2,
B2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/super.dart b/pkg/front_end/test/extensions/data/super.dart
index 3e96943..6df2f0e 100644
--- a/pkg/front_end/test/extensions/data/super.dart
+++ b/pkg/front_end/test/extensions/data/super.dart
@@ -5,6 +5,7 @@
/*library: scope=[
A2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/type_variables.dart b/pkg/front_end/test/extensions/data/type_variables.dart
index 296775d..bc8f390 100644
--- a/pkg/front_end/test/extensions/data/type_variables.dart
+++ b/pkg/front_end/test/extensions/data/type_variables.dart
@@ -7,6 +7,7 @@
A3,
A4,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/unnamed_declarations.dart b/pkg/front_end/test/extensions/data/unnamed_declarations.dart
index ee6e095..62a63d0 100644
--- a/pkg/front_end/test/extensions/data/unnamed_declarations.dart
+++ b/pkg/front_end/test/extensions/data/unnamed_declarations.dart
@@ -9,6 +9,7 @@
_extension#3,
_extension#4,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/test/extensions/data/use_as_type.dart b/pkg/front_end/test/extensions/data/use_as_type.dart
index 297f763..93af7ad 100644
--- a/pkg/front_end/test/extensions/data/use_as_type.dart
+++ b/pkg/front_end/test/extensions/data/use_as_type.dart
@@ -6,6 +6,7 @@
A2,
B2,
async.dart.FutureExtensions,
+ core.dart.DateTimeCopyWith,
core.dart.EnumByName,
core.dart.EnumName]*/
diff --git a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect
index 7cc8544..365fa6a 100644
--- a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect
@@ -156,6 +156,7 @@
core::Expando,
core::WeakReference,
core::Finalizer,
+ core::DateTimeCopyWith,
core::EnumName,
core::EnumByName,
core::identical,
diff --git a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect
index 3d807d3..6477beb 100644
--- a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect
@@ -91,6 +91,7 @@
core::Expando,
core::WeakReference,
core::Finalizer,
+ core::DateTimeCopyWith,
core::EnumName,
core::EnumByName,
core::identical,
diff --git a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect
index fc9a9ba..60b94a5 100644
--- a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect
@@ -152,6 +152,7 @@
core::Expando,
core::WeakReference,
core::Finalizer,
+ core::DateTimeCopyWith,
core::EnumName,
core::EnumByName,
core::identical,
diff --git a/pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect b/pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect
index 33ff62c..fbc3d26 100644
--- a/pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect
@@ -21,6 +21,7 @@
core::ConcurrentModificationError,
core::CyclicInitializationError,
core::DateTime,
+ core::DateTimeCopyWith,
core::Deprecated,
core::Duration,
core::Enum,
diff --git a/pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect b/pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect
index 99d8359..14ed11e 100644
--- a/pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect
@@ -21,6 +21,7 @@
core::ConcurrentModificationError,
core::CyclicInitializationError,
core::DateTime,
+ core::DateTimeCopyWith,
core::Deprecated,
core::Duration,
core::Enum,
diff --git a/sdk/lib/core/date_time.dart b/sdk/lib/core/date_time.dart
index 0bd6884..103e4e6 100644
--- a/sdk/lib/core/date_time.dart
+++ b/sdk/lib/core/date_time.dart
@@ -873,3 +873,58 @@
r'(?:[ T](\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d+))?)?)?' // Time part.
r'( ?[zZ]| ?([-+])(\d\d)(?::?(\d\d))?)?)?$'); // Timezone part.
}
+
+/// Adds [copyWith] method to [DateTime] objects.
+@Since("2.19")
+extension DateTimeCopyWith on DateTime {
+ /// Creates a new [DateTime] from this one by updating individual properties.
+ ///
+ /// The [copyWith] method creates a new [DateTime] object with values
+ /// for the properties [DateTime.year], [DateTime.hour], etc, provided by
+ /// similarly named arguments, or using the existing value of the property
+ /// if no argument, or `null`, is provided.
+ ///
+ /// Example:
+ /// ```dart
+ /// final now = DateTime.now();
+ /// final sameTimeOnMoonLandingDay =
+ /// now.copyWith(year: 1969, month: 07, day: 20);
+ /// ```
+ ///
+ /// Like for the [DateTime] and [DateTime.utc] constructors,
+ /// which this operation uses to create the new value,
+ /// property values are allowed to overflow or underflow the range
+ /// of the property (like a [month] outside the 1 to 12 range),
+ /// which can affect the more significant properties
+ /// (for example, a month of 13 will result in the month of January
+ /// of the next year.)
+ ///
+ /// Notice also that if the result is a local-time DateTime,
+ /// seasonal time-zone adjustments (daylight saving) can cause some
+ /// combinations of dates, hours and minutes to not exist, or to exist
+ /// more than once.
+ /// In the former case, a corresponding time in one of the two adjacent time
+ /// zones is used instead. In the latter, one of the two options is chosen.
+ DateTime copyWith({
+ int? year,
+ int? month,
+ int? day,
+ int? hour,
+ int? minute,
+ int? second,
+ int? millisecond,
+ int? microsecond,
+ bool? isUtc,
+ }) {
+ return ((isUtc ?? this.isUtc) ? DateTime.utc : DateTime.new)(
+ year ?? this.year,
+ month ?? this.month,
+ day ?? this.day,
+ hour ?? this.hour,
+ minute ?? this.minute,
+ second ?? this.second,
+ millisecond ?? this.millisecond,
+ microsecond ?? this.microsecond,
+ );
+ }
+}
diff --git a/tests/corelib/date_time_copy_with_test.dart b/tests/corelib/date_time_copy_with_test.dart
new file mode 100644
index 0000000..5e966a6
--- /dev/null
+++ b/tests/corelib/date_time_copy_with_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2012, 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 "package:expect/expect.dart";
+
+// Dart test program for DateTime.copyWith.
+
+testCopyWith(
+ DateTime original,
+ int? year,
+ int? month,
+ int? day,
+ int? hour,
+ int? minute,
+ int? second,
+ int? millisecond,
+ bool isUtc,
+) {
+ final result = original.copyWith(
+ year: year,
+ month: month,
+ day: day,
+ hour: hour,
+ minute: minute,
+ second: second,
+ millisecond: millisecond,
+ isUtc: isUtc,
+ );
+ final dateTimeConstructor = isUtc ? DateTime.utc : DateTime.new;
+ final expected = dateTimeConstructor(
+ year ?? original.year,
+ month ?? original.month,
+ day ?? original.day,
+ hour ?? original.hour,
+ minute ?? original.minute,
+ second ?? original.second,
+ millisecond ?? original.millisecond,
+ );
+
+ Expect.equals(expected, result);
+}
+
+void main() {
+ final epoch = DateTime.utc(1970, 1, 1);
+ final dst = DateTime.parse("2015-07-07T12:12:24Z");
+ final leap = DateTime.parse("2012-02-28T12:12:24");
+
+ for (var year in [null, -100, 1917, 2012]) {
+ for (var month in [null, -1, 1, 2, 12, 14]) {
+ for (var day in [null, -1, 1, 28, 29, 30, 31, 32]) {
+ for (var hour in [null, -1, 0, 23, 25]) {
+ for (var minute in [null, -1, 1, 59, 61]) {
+ for (var second in [null, -1, 1, 59, 61]) {
+ for (var millisecond in [null, -1, 1, 999, 1001]) {
+ for (var isUtc in [false, true]) {
+ for (var base in [epoch, dst, leap]) {
+ testCopyWith(
+ base,
+ year,
+ month,
+ day,
+ hour,
+ minute,
+ second,
+ millisecond,
+ isUtc,
+ );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tests/corelib_2/date_time_copy_with_test.dart b/tests/corelib_2/date_time_copy_with_test.dart
new file mode 100644
index 0000000..5d49909
--- /dev/null
+++ b/tests/corelib_2/date_time_copy_with_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2012, 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.
+
+// @dart=2.9
+
+import "package:expect/expect.dart";
+
+// Dart test program for DateTime.copyWith.
+
+testCopyWith(
+ DateTime original,
+ int year,
+ int month,
+ int day,
+ int hour,
+ int minute,
+ int second,
+ int millisecond,
+ bool isUtc,
+) {
+ final result = original.copyWith(
+ year: year,
+ month: month,
+ day: day,
+ hour: hour,
+ minute: minute,
+ second: second,
+ millisecond: millisecond,
+ isUtc: isUtc,
+ );
+
+ final expected = isUtc
+ ? DateTime.utc(
+ year != null ? year : original.year,
+ month != null ? month : original.month,
+ day != null ? day : original.day,
+ hour != null ? hour : original.hour,
+ minute != null ? minute : original.minute,
+ second != null ? second : original.second,
+ millisecond != null ? millisecond : original.millisecond,
+ )
+ : DateTime(
+ year != null ? year : original.year,
+ month != null ? month : original.month,
+ day != null ? day : original.day,
+ hour != null ? hour : original.hour,
+ minute != null ? minute : original.minute,
+ second != null ? second : original.second,
+ millisecond != null ? millisecond : original.millisecond,
+ );
+
+ Expect.equals(expected, result);
+}
+
+void main() {
+ final epoch = DateTime.utc(1970, 1, 1);
+ final dst = DateTime.parse("2015-07-07T12:12:24Z");
+ final leap = DateTime.parse("2012-02-28T12:12:24");
+
+ for (var year in [null, -100, 1917, 2012]) {
+ for (var month in [null, -1, 1, 2, 12, 14]) {
+ for (var day in [null, -1, 1, 28, 29, 30, 31, 32]) {
+ for (var hour in [null, -1, 0, 23, 25]) {
+ for (var minute in [null, -1, 1, 59, 61]) {
+ for (var second in [null, -1, 1, 59, 61]) {
+ for (var millisecond in [null, -1, 1, 999, 1001]) {
+ for (var isUtc in [false, true]) {
+ for (var base in [epoch, dst, leap]) {
+ testCopyWith(
+ base,
+ year,
+ month,
+ day,
+ hour,
+ minute,
+ second,
+ millisecond,
+ isUtc,
+ );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}