Я использую процедуру преобразования метки времени эпохи в год, месяц, день, часы, минуты и секунды.
Важное примечание: я не могу использовать какие-либо из существующих Java библиотек потому что эта процедура используется как тестовая программа, которая позже будет реализована в графическом процессоре. Поэтому не предлагайте использовать Localdate, ZonedDateTime, Datetime и т. Д. c. Подпрограмма должна использовать простые типы данных и c арифметические c операции.
Это спецификации:
- Входные данные -
UNIX Epoch timestamp in seconds
. - Выходные данные представляют собой строку с
year/month/day hour:minute
. - Дата и время ограничены от
January 1st 1990
до January 1st 2050
. No leap seconds
в качестве входных данных UNIX временные метки эпох.
Подпрограммой обрабатываются только действительные временные метки эпохи, основанные на этих условиях.
Это то, что я пробовал, и я включаю его как реплицируемый Java программа.
У меня есть действующая процедура, которая работает для дат после 1 января 2000 года: процедура epochToDatetimeBase2000
.
Я пытаюсь закодировать модуль, который будет работать с датами выше 1 января 1990 года, подпрограмма epochToDatetimeBase1990
, которая не работает.
Это полный воспроизводимый исходный код программы, включающий как процедуры, так и тестовые данные:
public class MyClass {
public static String epochToDatetimeBase2000(int epoch) {
int epochOriginal = epoch;
epoch = epoch - 946684800; // 946684800 is Epoch for Saturday, 1 January 2000 00:00:00
int[] days = new int[]{
0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335,
366, 397, 425, 456, 486, 517, 547, 578, 609, 639, 670, 700,
731, 762, 790, 821, 851, 882, 912, 943, 974,1004,1035,1065,
1096,1127,1155,1186,1216,1247,1277,1308,1339,1369,1400,1430
};
int second = epoch % 60;
epoch = epoch / 60;
int minute = epoch % 60;
epoch = epoch / 60;
int hour = epoch % 24;
epoch = epoch / 24;
int years = epoch/(365*4+1)*4;
epoch %= 365*4+1;
int year;
for (year=3; year>0; year=year-1)
{
if (epoch >= days[year*12])
break;
}
int month;
for (month=11; month>0; month--)
{
if (epoch >= days[year*12 + month])
break;
}
int yearVal = years+year;
int monthVal = month+1;
int dayVal = epoch-days[year*12 + month]+1;
String strDatetime = String.format("%d %02d/%02d/%02d %02d:%02d.%02d", epochOriginal, dayVal, monthVal, 2000+yearVal, hour, minute, second); // Float value.
return strDatetime;
}
public static String epochToDatetimeBase1990(int epoch) {
int epochOriginal = epoch;
epoch = epoch - 631152000; // 631152000 is Epoch for Monday, 1 January 1990 00:00:00
int[] days = new int[]{
0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335,
366, 397, 425, 456, 486, 517, 547, 578, 609, 639, 670, 700,
731, 762, 790, 821, 851, 882, 912, 943, 974,1004,1035,1065,
1096,1127,1155,1186,1216,1247,1277,1308,1339,1369,1400,1430
};
int second = epoch % 60;
epoch = epoch / 60;
int minute = epoch % 60;
epoch = epoch / 60;
int hour = epoch % 24;
epoch = epoch / 24;
int years = epoch/(365*4+1)*4;
epoch %= 365*4+1;
int year;
for (year=3; year>0; year=year-1)
{
if (epoch >= days[year*12])
break;
}
int month;
for (month=11; month>0; month--)
{
if (epoch >= days[year*12 + month])
break;
}
int yearVal = years+year;
int monthVal = month+1;
int dayVal = epoch-days[year*12 + month]+1;
String strDatetime = String.format("%d %02d/%02d/%02d %02d:%02d.%02d", epochOriginal, dayVal, monthVal, 1990+yearVal, hour, minute, second); // Float value.
return strDatetime;
}
public static void main(String args[]) {
// USING BASE 2000
System.out.println(epochToDatetimeBase2000(978307200)); // Epoch timestamp: 978307200 Date and time (GMT): Monday, 1 January 2001 00:00:00
System.out.println(epochToDatetimeBase2000(631152000)); // Epoch timestamp: 631152000 Date and time (GMT): Tuesday, 1 January 1990 00:00:00
System.out.println(epochToDatetimeBase2000(662688000)); // Epoch timestamp: 662688000 Date and time (GMT): Tuesday, 1 January 1991 00:00:00
// USING BASE 1990
System.out.println(epochToDatetimeBase1990(978307200)); // Epoch timestamp: 978307200 Date and time (GMT): Monday, 1 January 2001 00:00:00
System.out.println(epochToDatetimeBase1990(631152000)); // Epoch timestamp: 631152000 Date and time (GMT): Tuesday, 1 January 1990 00:00:00
System.out.println(epochToDatetimeBase1990(662688000)); // Epoch timestamp: 662688000 Date and time (GMT): Tuesday, 1 January 1991 00:00:00
}
}
Это результат:
978307200 01/01/2001 00:00.00
631152000 -729/01/1992 00:00.00
662688000 -364/01/1992 00:00.00
978307200 01/01/2001 00:00.00
631152000 01/01/1990 00:00.00
662688000 31/12/1990 00:00.00 <- SHALL BE 1 January 1991 00:00:00