Reference
In Powershell, the method
New-Object DateTime(9999, 12, 31, 23, 59, 59, 59, ([DateTimeKind]::Utc))
is the correct one, as the others create the time in Local TZ, and then convert it and store it in UTC and then it can be displayed again in UTC, whereas the above method creates it in UTC in the first place.
You can test this by reaching the .NET DateTime limits like the above, whereas if you run the script from the "accepted solution" at the limits
(Get-Date -Date "9999-12-31T23:59:59.99Z").ToUniversalTime()
run from a system with a local time zone ahead of UTC, e.g. UTC+1, then you'll receive the below error:
Get-Date: Cannot bind parameter 'Date'. Cannot convert value "9999-12-31T23:59:59.99Z" to type "System.DateTime". Error: "The DateTime represented by the string '9999-12-31T23:59:59.99Z' is out of range."