System.TM does not work as advertised. The documentation says that
the timezone will be UTC when you supply a number to the constructor,
but that does not appear to be the case. Note how the timezone is
CEST no matter how I initialize the TM object, but the reported hours
differ:
$ pike
Pike v9.0 release 1 running Hilfe v3.5 (Incremental Pike Frontend)
> mixed t = System.TM(1697121800);
> t;
(1) Result: System.TM(Thu Oct 12 15:43:20 2023 CEST)
> t->gmtime(1697121800);
(2) Result: 1
> t;
(3) Result: System.TM(Thu Oct 12 15:43:20 2023 CEST)
> t->localtime(1697121800);
(4) Result: 1
> t;
(5) Result: System.TM(Thu Oct 12 16:43:20 2023 CEST)
The result (5) makes sense: it matches what I would expect. But
the hour should be set to 14, not 15:
> mixed c = Calendar.ISO.Second(1697121800);
> c->set_timezone("UTC");
> c;
(5) Result: Second(Thu 12 Oct 2023 16:43:20 CEST)
> mixed u = c->set_timezone("UTC");
> u;
(6) Result: Second(Thu 12 Oct 2023 14:43:20 UTC)
This also agrees with my private utility for converting a time_t value
to the local timezone and UTC (this one is written in Python):
$ time_t2date 1697121800
2023-10-12 16:43:20 CEST
2023-10-12 14:43:20 GMT
Tested on the current master, and a few older Pike versions.