Intel FORTRAN time_and_date function returns UTC instead of local time
Tim Prince
n8tm@aol.com
Thu Jan 24 12:54:00 GMT 2013
On 1/24/2013 5:01 AM, Marten Jan de Ruiter wrote:
> I wrote a FORTRAN program using the time_and_date function. The source follows below. The time_and_date function returns the wrong time: I am not in UTC, so czone should be +0100.
>
> In the following output, the lines "ctime:..." to "milliseconds..." are based on time_and_date. The line 15:54:49 is the correct time obtained by the time function, and the line 23-JAN-13 is the correct date obtained by the date function.
>
> ctime: 20130123
> cdate: 145449.947
> czone: -0000
> @ 2013-01-23 14:54:49.947
> year 2013
> month 1
> day 23
> diff wrt UTC 0 minutes
> hours 14
> minutes 54
> seconds 49
> milliseconds 947
>
> 15:54:49
> 23-JAN-13
>
>
> I have done some experiments to narrow down the problem:
> * compiling with gfortran: time_gfortran.exe gives correct result in Cygwin
> * compiling with g95: time_g95.exe gives the correct result in Cygwin
> * compiling with ifort: time_ifort.exe gives the wrong time in Cygwin
>
> After copying cygwin1.dll, cyggfortran-3.dll and cyggcc_s-1.dll to the working directory, I get correct results
> using the three executables in c:\windows\system32\cmd.exe.
>
> I suspect that the intel compiler does a different system call for time_and_date than for date and time, that the system call is intercepted by Cygwin, and not properly handled. I am still baffled why the same source runs fine for gfortran and g95. Notice however that for these compilers, the _date_ and _time_ functions are not defined. Hence the preprocessor exclusion in the source.
>
> Does anyone know how I can trace the system calls of my executables?
>
> Regards,
>
> Marten Jan
>
>
>
> The following example comes from the documentation of Intel:
>
> Consider the following
> example executed on 2000 March 28 at 11:04:14.5: INTEGER DATE_TIME (8) CHARACTER (LEN = 12) REAL_CLOCK (3) CALL DATE_AND_TIME (REAL_CLOCK (1), REAL_CLOCK (2), & REAL_CLOCK (3), DATE_TIME)
> This assigns the value
> "20000328" to REAL_CLOCK (1), the value "110414.500" to REAL_CLOCK (2), and the
> value "-0500" to REAL_CLOCK (3). The following values are assigned to DATE_TIME:
> 2000, 3, 28, -300, 11, 4, 14, and 500.
>
>
> The following is the source of my program:
>
> program time_and_date
>
> implicit none
>
> character (len=8) cdate
> character (len=10) ctime
> character (len=5) czone
> integer(4) ival(8)
> integer(4) yr,mon,day,hr,min,sec,ms
>
> call date_and_time(cdate,ctime,czone,ival)
>
> read (cdate(1:4),*) yr
> read (cdate(5:6),*) mon
> read (cdate(7:8),*) day
> read (ctime(1:2),*) hr
> read (ctime(3:4),*) min
> read (ctime(5:6),*) sec
> read (ctime(8:10),*) ms
> print *,'cdate ',cdate
> print *,'ctime ',ctime
> print *,'czone ',czone
> print "('@ ',i4,'-',i2.2,'-',i2.2,' ',i2.2,':',i2.2,':',i2.2,'.',i3.3)", yr,mon,day,hr,min,sec,ms
> print *,'year ',ival(1)
> print *,'month ',ival(2)
> print *,'day ',ival(3)
> print *,'diff wrt UTC ',ival(4),' minutes'
> print *,'hours ',ival(5)
> print *,'minutes ',ival(6)
> print *,'seconds ',ival(7)
> print *,'milliseconds ',ival(8)
> print *
>
> #ifdef IFORT
> call time(ctime)
> print *,ctime
>
> call date(ctime)
> print *,ctime
> #endif
>
> print *,'done'
>
> end program
>
>
>
For what little it's worth, the documentation of the ifort legacy time()
and date() functions states that they aren't reliable for dates beyond
year 1999 and the Fortran standard date_and_time should be used. There
is no documented time_and_date(). As others hinted, ifort bypasses
cygwin .dll entirely, so the question has no relationship to cygwin,
although it could be related to your calendar clock settings and the way
Windows date setting is incompatible with practices accepted outside
Windows.
-- Tim Prince
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
More information about the Cygwin
mailing list