Fortran中的日期时差

时间:2013-06-27 22:12:05

标签: datetime fortran datediff

我的目标是让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

由于能够在其他环境中进行此类计算(秒表等),我真的很感激不涉及任何外部扩展或冒险手动编码的解决方案(365 ...闰年... < / em> /400..等等)。

有没有办法使用fortran和系统(win64)的实习生为我的目的?

如果没有,通过哪种方式将系统的时间信息传递给fortran,这可能是模仿的(因此源不是“系统”而是“字符串”)?

编辑:感谢您到目前为止的输入,但如上所述,我最好使用fortrans实习生能力(因为它在秒表中发生)用于工作而不是扩展或手动计算。我发现很难相信日期和时间只能转换为角色而不是相反的方式......但是无论如何,谢谢你。

3 个答案:

答案 0 :(得分:6)

我经常在Fortran中处理日期和时间,所以我最终为它编写了一个库:

http://github.com/milancurcic/datetime-fortran

它支持datetimetimedelta对象的基本算术和比较运算符(在Python的日期时间之后松散建模),并且还提供与C strftimestrptime的接口,以及更多。

从版本0.3.0开始,strftimestrptime接口被定义为直接在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 

在我的电脑上。

答案 1 :(得分:2)

如果您始终遵循YYYYMMDD HHMMSS的规则,可以使用格式

进行解析

I4,2I2,1X,3I2

从HHMMSS计算秒数非常简单。 HH * 3600 + MM * 60 + SS。从YYYYMMDD开始计算秒数并不容易。你需要像Zeller一致的变体。在C中,这将是

DD +((MM> = 3?(MM + 1):( MM + 13))* 30.6001)+((MM> = 3?YYYY:(YYYY-1))* 1461/4)< / p>

此变体的工作时间为1900年至2100年2月28日。之后它将在1天之内完成。你得到的数字非常大,所以选择一个起点20000101并减去该值。将该数字乘以86400,添加HHMMSS计算,您将获得自2000年1月1日以来的秒数。

原始公式使用30.6,但是你需要额外的001用于32位实数,因为当移位一位小数时,6倍表不能很好地转换。

答案 2 :(得分:0)

我正在寻找有关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

更多信息,请访问: http://aa.usno.navy.mil/faq/docs/JD_Formula.php