Итак, чтобы ответить на это:
Я на самом деле попробовал нативный strftime
в C:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char*argv[])
{
time_t t = 0;
struct tm * tmp = localtime(&t);
char outstr[200];
strftime(outstr,sizeof(outstr),"%T",tmp);
printf(outstr);
exit(EXIT_SUCCESS);
}
, который, очевидно, вернул 01:00:00 из-за использования localtime()
, а не gmtime()
. Поскольку временные метки не содержат никакого часового пояса, для меня теперь стало очевидным, что время действительно приспособилось к моему часовому поясу, который был CET
на 1 января 1970 года.
Грязный обходной путь для этого работа будет такой:
public static String secondsToTwentyFourHourString(long seconds)
{
TimeZone current = TimeZone.getDefault();
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
seconds *= 1000;
try
{return String.format("%1$TH:%1$TM:%1$TS", seconds);}
finally
{TimeZone.setDefault(current);}
}
лучшее решение - использовать Java 8 классы времени:
public static String secondsToTwentyFourHourString(long seconds)
{
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneId.of("UTC"));
return zdt.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
}