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,
+                    );
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}