I’m struggling with JavaScript’s proposed new Temporal API. What I am trying to do should be straight-forward, yet I fail to find a convincing solution. I must be missing something.
The task is as follows: instantiate an object representation of an UTC datetime from variables for year, month, day, hour and minute.
My thinking is as follows:
- we are talking UTC so I need a
Temporal.Instant; new Temporal.Instant()requires the timestamp in nanoseconds so that doesn’t work;Temporal.Instant.from()requires a ISO datetime string, which would require me to generate a properly formatted piece of text from the five variables I have — this is possible but a bit of a hack and kinda defeating the purpose of using a datetime library;Temporal.PlainDateTime.from()has the right design, as it accepts an object like{ year, month, day, hour, minute };- so then all we need to do is creating an
Instantfrom thisPlainDateTime. This does not seem to be possible though? Other than through — once again — a datetime string or a timestamp in ns…?
This is silly! The use case here is super basic, and yet it’s not obvious (to me) at all how to address it.
I was expecting to be able to simply do something like: Temporal.Instant.from({ year, month, day, hour, minute });
Now the best I can come up with is: Temporal.Instant.from(year + '-' + String(month).padStart(2, '0') + '-' + String(day).padStart(2, '0') + 'T' + String(hour).padStart(2, '0') + ':' + String(minute).padStart(2, '0') + 'Z'); //
Please tell me I’m bigtime overlooking something.
Your
PlainDateTimerepresents "a calendar date and wall-clock time that does not carry time zone information". To convert it to an exact time, you need to supply a timezone, using thetoZonedDateTimemethod. By then ignoring calendar and timezone via thetoInstantmethod, you can get the desiredInstantinstance.So there's a few ways to achieve this:
Create a
PlainDateTimefrom an object, convert it to an instant by assumingUTCtimezone:Create a
PlainDateTimeusing the constructor, convert it to an instant by assumingUTCtimezone:Create a
ZonedDateTimedirectly from an object, providing the timezone in there, then convert it:Instead of going via a zoned datetime, you can also get the instant that a
TimeZoneinstance ascribes to aPlainDateTimeobject:If you wanted to hardcode the instant in your code, you could also directly create it from an ISO string:
If you are open to including the old
Datemethods, you could also useDate.UTCto compute the millisecond value for the instant - beware zero-based months:Try them for yourselves with your particular example: