Чтобы прояснить проблему, прежде чем раскрыть решение: вот шаги, которые я предпринимаю в Maxima v5.30, чтобы получить время в формате UTC в удобочитаемом формате:
Примечание. Когда я использую Maxima v5.30 (в Великобритании), по какой-то неизвестной причине время всегда корректируется по Гринвичу на 10 часов и не корректируется по летнему времени.
/* 1st Jan 2017 12 noon: */
timedate(3692260800); /* "2017-01-01 22:00:00+10:00" */
timedate(3692260800-10*3600); /* "2017-01-01 12:00:00+10:00" */
substring(timedate(3692260800-10*3600),1,20); /* "2017-01-01 12:00:00" */
Примечание: timedate работает лучше/по-другому в более поздних версиях Maxima, но некоторые учреждения рекомендуют устанавливать определенную версию Maxima.
Иногда мне нужна дата в форме: «ггггММддЧЧммсс». Функция для этого:
SecUTCToDate(vSec,vHour):=
block([d1,d2],
d1:timedate(vSec+vHour*3600),
d2:concat(substring(d1,1,5), substring(d1,6,8), substring(d1,9,11), substring(d1,12,14), substring(d1,15,17), substring(d1,18,20)),
parse_string(d2)
);
Примечание: [d1,d2]
сохраняет эти переменные локальными внутри блока, а не глобальными.
Чтобы получить местное время, мне нужно добавить часы в зависимости от моего часового пояса (0 в Великобритании) и летнего времени. Чтобы вычислить, находится ли время в периоде летнего времени, требуется отдельная функция для каждого часового пояса: в Великобритании и многих европейских странах одна из таких функций:
/* correct for the years 1900-2200 inclusive */
SecUTCIsDSTUK(vSec):=
block([vLeap,vDaysMar25,vDaysOct25,vWDayMar25,vWDayOct25,vRange1,vRange2],
vYear : parse_string(substring(timedate(vSec),1,5)),
vLeap : floor((vYear-1900)/4), if (vYear>=2100) then vLeap : vLeap-1,
vDaysMar25 : (vYear-1900)*365 + vLeap + 83,
vDaysOct25 : vDaysMar25 + 214,
vWDayMar25 : mod(vDaysMar25+1,7),
vWDayOct25 : mod(vDaysOct25+1,7),
vRange1 : (vDaysMar25+mod(-vWDayMar25,7))*86400 + 3600,
vRange2 : (vDaysOct25+mod(-vWDayOct25,7))*86400 + 3600,
if ((vSec >= vRange1) and (vSec < vRange2)) then 1 else 0);
Вы можете создать файл Mac с такой функцией и вызывать функцию при необходимости, например:
load("C:\\MyFolder\\MyFile.mac");
SecUTCIsDSTUK(absolute_real_time());
SecUTCIsDSTUK(absolute_real_time()+86400*180);
person
vafylec
schedule
01.03.2017