我的目标是让fortran返回作为字符串传入的两个时间之间的差异,与VBA的TimeDiff非常相似。我已经在 Fortran 中处理日期和时间有一段时间了,但在这种特殊情况下找不到我需要的东西。 Fortran 中的第一个问题是如何将字符串转换为进一步可计算的时间变量。例如,time_and_dates ctime 将时间转换为字符串,但我的情况所需的恰恰相反。
由于 Fortran 可以轻松计算出程序完成所需时间的点表之类的东西,甚至显示系统本身的时间,因此如果到目前为止我的想法是正确的,它显然能够计算出这些东西。
但是如何将我的字符串“YYYYMMDD HHMMSS”传递为时间格式,如何用它计算以及如何表达输出?
这里是一个示例:
date1 = as.date("20130512 091519") !Stringinput
date2 = as.date("20131116 120418")
result = time.difference(date1,date2,outputunit="seconds")
print*, 'time diff in sec: ', result !returns something like 4646345 as Integer
由于 fortrans 能够在其他上下文(秒表等)中进行此类计算,我真的很感激一个不涉及任何外部扩展或冒险的手动编码的解决方案(365 ...闰年... /400 ..等等)。
有没有办法利用 fortran 和系统(win64)的实习机会来达到我的目的?
如果不是,通过什么方式将系统的时间信息传递到fortran中,这是否可以被模仿(所以源不是“系统”而是“字符串”)?
编辑:感谢您到目前为止的输入,但如上所述,我更愿意使用 fortrans 实习生能力(因为它发生在秒表中)来完成工作,而不是扩展或手动计算。我发现很难相信日期和时间只能转换为字符,而不能转换为字符......但无论如何还是谢谢你。
我经常在 Fortran 中处理日期和时间,所以我最终为其编写了一个库:
http://github.com/milancurcic/datetime-fortran
它支持
datetime
和 timedelta
对象的基本算术和比较运算符(大致模仿 Python 的日期时间),并且还提供与 C strftime
和 strptime
等的接口。
从0.3.0版本开始,
strftime
和strptime
接口被定义为直接在datetime
实例上操作,所以不需要摆弄tm_structs。
这是一个可以处理您的情况的简单程序:
USE datetime_module
TYPE(datetime) :: date1,date2
TYPE(timedelta) :: timediff
CHARACTER(LEN=15) :: str1 = "20130512 091519"
CHARACTER(LEN=15) :: str2 = "20131116 120418"
date1 = strptime(str1,"%Y%m%d %H%M%S")
date2 = strptime(str2,"%Y%m%d %H%M%S")
timediff = date2-date1
WRITE(*,*)timediff
WRITE(*,*)timediff % total_seconds()
END
输出:
188 2 48 59 0
16253339.000000000
在我的电脑上。
如果你一直遵循YYYYMMDD HHMMSS的规则,可以用以下格式解析
I4,2I2,1X,3I2
从 HHMMSS 算出秒数很容易。高*3600+毫米*60+不锈钢。 从 YYYYMMDD 计算秒数并不那么容易。 你需要类似泽勒同余的变体。 在 C 语言中,这将是
DD + ((MM >= 3? (MM + 1): (MM + 13))*30.6001) + ((MM>=3?YYYY:(YYYY-1)) * 1461 / 4)
此变体的运行时间为 1900 年至 2100 年 2 月 28 日。之后 1 天就会失效。 您将得到的数字非常大,因此选择一个起点(例如 20000101)并减去该值。 将该数字乘以 86400,加上 HHMMSS 计算结果,您将得到自 01/01/2000 以来的秒数。
原始公式使用 30.6,但对于 32 位实数,您需要额外的 001,因为 6 倍表在移动一位小数时不能很好地转换。
我正在寻找有关 Fortran 中日期的一些逻辑。 我找到了一些紧凑的东西,也可以帮助你!!
INTEGER FUNCTION JD (YEAR,MONTH,DAY)
C
C---COMPUTES THE JULIAN DATE (JD) GIVEN A GREGORIAN CALENDAR
C DATE (YEAR,MONTH,DAY).
C
INTEGER YEAR,MONTH,DAY,I,J,K
C
I= YEAR
J= MONTH
K= DAY
C
JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12)
& /12-3*((I+4900+(J-14)/12)/100)/4
C
RETURN
END
给定一个以天为单位的整数日期(儒略日),返回一个字符串 DD/MM/YYYY(公历日期) - 基于 https://aa.usno.navy.mil/faq/JD_formula 但经过修改以获得用户定义函数格式的 DD/MM/YYYY,不是子程序-:
CHARACTER*19 FUNCTION GDATE(JD)
C
C---COMPUTES THE GREGORIAN CALENDAR DATE GDATE (AS A STRING)
C GIVEN THE JULIAN DATE (JD, AN INTEGER).
C
INTEGER*4 JD,I,J,K
CHARACTER*2 D,M
CHARACTER*4 Y
C
L= JD+68569
N= 4*L/146097
L= L-(146097*N+3)/4
I= 4000*(L+1)/1461001
L= L-1461*I/4+31
J= 80*L/2447
K= L-2447*J/80
L= J/11
J= J+2-12*L
I= 100*(N-49)+I+L
write (D,'(i2.2)') K
write (M,'(i2.2)') J
write (Y,'(i4)') I
GDATE = D//'/'//M//'/'//Y
RETURN
END