Вопрос или проблема
У меня есть временные метки в строке, например:
02/05/2024 00:21:45 (день/месяц/год)
Мне нужно получить соответствующий ей эпо́хальный временной штамп (количество секунд с 1 января 1970 года). Я не нашел ничего в интернете, только для Bash и Java… или, возможно, нашел что-то довольно эзотерическое, что не понял
Ответ или решение
Для преобразования строки с временной меткой в формате "дд/мм/гггг чч:мм:сс" в эпоху (число секунд с 1 января 1970 года) в языке Fortran, можно воспользоваться следующими шагами. Данный процесс включает разбор строки, преобразование отдельных компонентов даты и времени в формат, понятный стандартным временным функциям, а затем вычисление разницы с началом эпохи.
Шаг 1: Подготовка программы
Необходимо создать программу, в которой мы будем хранить дату и время в строковом формате, а затем извлечем из этой строки компоненты дня, месяца, года, часов, минут и секунд.
Шаг 2: Извлечение компонентов времени
Несмотря на то, что Fortran не имеет встроенной функции для работы с временными зонами или конвертации в epoch, мы можем вручную обработать строку, используя стандартные функции языка.
Пример кода
program datetime_to_epoch
implicit none
character(len=20) :: datetime_string
integer :: day, month, year, hour, minute, second
integer :: epoch_time
integer, parameter :: epoch_start = 1970
integer :: days_in_month(12) = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
integer :: i, total_days
! Вводим строку
datetime_string = "02/05/2024 00:21:45"
! Разбор строки
read(datetime_string, '(I2.2, "/", I2.2, "/", I4.4, " ", I2.2, ":", I2.2, ":", I2.2)') &
day, month, year, hour, minute, second
! Проверяем, является ли год високосным
if (mod(year, 4) == 0 .and. (mod(year, 100) /= 0 .or. mod(year, 400) == 0)) then
days_in_month(2) = 29 ! Февраль имеет 29 дней в високосный год
end if
! Подсчет общего количества дней с 01.01.1970 до данной даты
total_days = 0
! Считаем дни с 1970 по предшествующий год
do i = epoch_start, year - 1
if (mod(i, 4) == 0 .and. (mod(i, 100) /= 0 .or. mod(i, 400) == 0)) then
total_days = total_days + 366
else
total_days = total_days + 365
end if
end do
! Считаем дни в текущем году
do i = 1, month - 1
total_days = total_days + days_in_month(i)
end do
total_days = total_days + day - 1 ! Исключаем текущий день
! Преобразование в секунды
epoch_time = total_days * 86400 + hour * 3600 + minute * 60 + second
! Вывод результата
print *, "Epoch time: ", epoch_time
end program datetime_to_epoch
Объяснение кода
-
Чтение строки: В программе используется встроенная функция
read
, чтобы извлечь отдельные компоненты даты и времени. -
Проверка високосного года: Учитывается возможность високосного года для корректного подсчета дней в феврале.
-
Подсчет дней: Сначала подсчитывается общее количество дней от 1 января 1970 года до начала указанного года, затем добавляются дни, прошедшие в текущем году до указанной даты.
-
Преобразование в секунды: Всей промежуток времени переводится в секунды.
-
Вывод результата: Результат выводится в стандартный вывод, показывая epoch время.
Заключение
Таким образом, мы можем легко конвертировать дату из строкового формата в epoch в Fortran, следуя описанным шагам. Этот подход можно адаптировать для любых форматов даты, изменяя строки входных данных и формат запроса.