This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Re: Intel FORTRAN time_and_date function returns UTC instead of local time


Op 24-1-2013 13:54, Tim Prince schreef:
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
Thanks, it is an inconsistency in my program naming. Since I actually use the Fortran standard date_and_time(), this is not the issue. The notable thing is that the legacy time() and date() work properly in the cygwin environment. Since those calls do not work in g95 and gfortran, I can not use those calls. As a work-around, I could use date_and_time() for the c95 and gfortran compiler, and date() and time() for the ifort compiler, using the preprocesser to select the proper routines.

I still do not understand why time_ifort.exe works properly in the cmd environment, and why only its call to date_and_time() does not work properly in the cygwin environment.

I could not find anything in the mailing list for date_and_time, but I'll look further into ifort and cygwin.dll.

Thanks for the effort,

Marten Jan


-- 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]