3

我的目标是让 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 实习生能力(就像在秒表中发生的那样)来完成这项工作,而不是扩展或手动计算。我发现很难相信日期和时间只能转换为字符,而不能反过来……但还是谢谢你。

4

3 回答 3

6

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

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

datetime它支持和对象的基本算术和比较运算符timedelta(松散地模仿 Python 的日期时间),还提供了 Cstrftime和的接口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 

在我的电脑上。

于 2013-06-28T04:50:12.293 回答
2

如果你总是遵循 YYYYMMDD HHMMSS 的规则,它可以用格式解析

I4,2I2,1X,3I2

从 HHMMSS 计算秒数很容易。高*3600 + 毫米*60 + 不锈钢。从 YYYYMMDD 算出秒数并不容易。你需要类似 Zeller 同余的变体。在 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 计算,您将得到自 2000 年 1 月 1 日以来的秒数。

原始公式使用 30.6,但对于 32 位实数,您需要额外的 001,因为 6 乘法表在移动小数点后不能很好地转换。

于 2013-06-28T04:43:22.193 回答
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

于 2018-07-10T13:29:08.047 回答