как преобразовать строку даты и времени в эпоху в Fortran

Вопрос или проблема

У меня есть временные метки в строке, например:

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

Объяснение кода

  1. Чтение строки: В программе используется встроенная функция read, чтобы извлечь отдельные компоненты даты и времени.

  2. Проверка високосного года: Учитывается возможность високосного года для корректного подсчета дней в феврале.

  3. Подсчет дней: Сначала подсчитывается общее количество дней от 1 января 1970 года до начала указанного года, затем добавляются дни, прошедшие в текущем году до указанной даты.

  4. Преобразование в секунды: Всей промежуток времени переводится в секунды.

  5. Вывод результата: Результат выводится в стандартный вывод, показывая epoch время.

Заключение

Таким образом, мы можем легко конвертировать дату из строкового формата в epoch в Fortran, следуя описанным шагам. Этот подход можно адаптировать для любых форматов даты, изменяя строки входных данных и формат запроса.

Оцените материал
Добавить комментарий

Капча загружается...