2014-05-21 119 views
1

根据current GCC documentation,当我打电话给CTIME时,我应该得到如下格式的日期:“Sat Aug 19 18:13:14 1995”。但是,我运行GCC 4.8.1(MinGW),我得到的输出是这样的:“08/19/95 18:13:14”。我实际上有一个我测试过的GCC(0.5)的古老版本,并且在同一台机器上,该版本正确地格式化输出。有没有什么办法可以让CTIME以记录格式输出,还是我坚持写自己的例程来获得这种格式?我需要这种格式感谢我正在处理的一些遗留代码。Fortran的CTIME输出格式

+0

不是你的问题的答案,但你可能会发现https://github.com/milancurcic/datetime-fortran有用。 – milancurcic

回答

3

首先,请将GFortran bug发布到GCC bugzilla https://gcc.gnu.org/bugzilla。不能保证发布到stackoverflow的错误报告不会在噪音中丢失。 FWIW,我将这个bug提交到https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61310

对于一些背景,GFortran的这种变化是由于努力摆脱线程不安全的C库函数,如ctime()。 POSIX提供了一个称为ctime_r()的线程安全变体,它遇到了许多问题,例如实际上不同的接口(一些商业unix支持基于POSIX标准草案的函数,其中ctime_r具有不同的参数),bug规格说应该足够了26字节,依此类推。最后,POSIX 2008放弃了ctime_r标记,并建议使用strftime()代替。因此,GFortran遵循这个建议,在测试后发现带有“%c”说明符的strftime()生成的字符串格式与ctime()相同,只要程序处于默认的“C”语言环境。由于GFortran本身从不设置语言环境(通过调用setlocale),因此这被认为足够好。不幸的是,正如你发现的那样,MSVC libc中的strftime()不会为%c说明符生成类似ctime()的字符串。无论如何,现在应该修复这个问题,希望这次能够取得好成绩。

在任何情况下,使用标准的date_and_time将比解析ctime的输出更健壮。

+0

谢谢,我试着定期向GCC bugzilla填充bug,但我的知识不够好。 –

+0

我对Fortran的能力还不够自信,无法评估问题是一个错误还是仅仅是缺乏理解。感谢您提交错误报告以及您的答案。 –

2

从你给的链接:

[...]除非应用程序已调用的setlocale,输出将默认区域,长度为24和形式的“星期六18年8月19日的: 1995年11月14日'。在其他语言环境中,可能会导致更长的字符串。

因此,输出取决于您当前的语言环境(并且您的计算机上可能选择了与编写文档的人不同的语言环境)。

+0

是的,我看到了setlocale的提及,但我找不到任何有关操作的信息。你知道我会怎么做吗? –

+0

而不是'ctime()'我会使用符合标准的['date_and_time()'](https://gcc.gnu.org/onlinedocs/gfortran/DATE_005fAND_005fTIME.html#DATE_005fAND_005fTIME)。从那里,你可以建立你自己的(便携式)时间戳。 –

+0

由于这是我正在处理的遗留代码,因此与Fortran 77兼容的子程序将更可取。我很想知道setlocale是如何工作的。 –