You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Fortran 90中获取昨日日期?含Perl方案优化诉求

在Fortran 90中获取昨日日期的几种方案

方案一:直接在Fortran中计算昨日日期

不需要依赖外部脚本,通过date_and_time获取当前日期后,手动处理日期逻辑即可,核心是要覆盖闰年、不同月份天数差异的情况。

核心逻辑

  • 如果当前日大于1,直接将日减1得到昨日日期
  • 如果当前是当月1号:
    • 若为1月,则年份减1,月份改为12,日改为31
    • 其他月份则月份减1,日改为上月的最后一天(需判断上月是30/31天,2月需额外判断闰年)

完整Fortran代码示例

program get_yesterday_date
    implicit none
    integer :: year, month, day, yesterday_year, yesterday_month, yesterday_day
    character(len=8) :: date_str

    ! 获取当前日期(格式YYYYMMDD)
    call date_and_time(date=date_str)
    read(date_str(1:4), '(I4)') year
    read(date_str(5:6), '(I2)') month
    read(date_str(7:8), '(I2)') day

    ! 计算昨日日期
    if (day > 1) then
        yesterday_year = year
        yesterday_month = month
        yesterday_day = day - 1
    else
        if (month == 1) then
            yesterday_year = year - 1
            yesterday_month = 12
            yesterday_day = 31
        else
            yesterday_month = month - 1
            ! 获取上月最后一天的天数
            select case(yesterday_month)
                case(4,6,9,11)
                    yesterday_day = 30
                case(2)
                    if (is_leap(yesterday_year)) then
                        yesterday_day = 29
                    else
                        yesterday_day = 28
                    end if
                case default
                    yesterday_day = 31
            end select
            yesterday_year = year
        end if
    end if

    ! 输出格式化后的昨日日期(YYYYMMDD)
    write(*, '(I4,I2.2,I2.2)') yesterday_year, yesterday_month, yesterday_day

contains
    ! 判断闰年的辅助函数
    logical function is_leap(y)
        integer, intent(in) :: y
        is_leap = .false.
        if (mod(y,4) == 0) then
            if (mod(y,100) /= 0) then
                is_leap = .true.
            else if (mod(y,400) == 0) then
                is_leap = .true.
            end if
        end if
    end function is_leap

end program get_yesterday_date

方案二:在Fortran中直接调用Perl脚本

通过Fortran的管道功能,直接调用你编写的Perl脚本并读取输出,无需生成中间文件。

操作步骤

  1. 将你的Perl脚本保存为yesterday.pl,Linux/macOS下执行chmod +x yesterday.pl赋予执行权限
  2. 在Fortran中通过管道打开脚本,读取输出的日期字符串

Fortran代码示例

program call_perl_yesterday
    implicit none
    character(len=8) :: yesterday_date
    integer :: iostat

    ! 管道调用Perl脚本(Windows下需改为'|perl yesterday.pl')
    open(unit=10, file='|./yesterday.pl', status='old', action='read', iostat=iostat)
    if (iostat /= 0) then
        write(*, *) "调用Perl脚本失败,请检查脚本路径或Perl环境"
        stop
    end if

    read(10, '(A8)') yesterday_date
    close(10)

    write(*, *) "昨日日期:", yesterday_date

end program call_perl_yesterday

方案三:优化现有文件读写方案

沿用你当前的思路,通过Perl脚本生成日期文件后由Fortran读取,可在Fortran中自动触发脚本执行,无需手动运行。

Fortran代码示例

program read_yesterday_from_file
    implicit none
    character(len=8) :: yesterday_date
    integer :: iostat

    ! 调用Perl脚本生成日期文件(Windows下需改为'perl yesterday.pl > yesterday.txt')
    call system('./yesterday.pl > yesterday.txt')

    ! 读取日期文件
    open(unit=10, file='yesterday.txt', status='old', action='read', iostat=iostat)
    if (iostat /= 0) then
        write(*, *) "无法打开日期文件,请检查脚本执行是否成功"
        stop
    end if

    read(10, '(A8)') yesterday_date
    close(10)

    write(*, *) "昨日日期:", yesterday_date

end program read_yesterday_from_file

内容的提问来源于stack exchange,提问作者Zilore Mumba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:05:11