Am 04.11.2011 11:28, schrieb Hans-Peter Diettrich:
Sven Barth schrieb:

According to Delphi help a TDateTime of 0.0 represents 12/30/1899 12:00
am, while Wikipedia states "start counting the seconds from the Unix
epoch of 1970-01-01T00:00:00 UTC".

You are aware that the definition of TDateTime and that of the Unix
timestamp are not supposed to be the same? The original TDateTime
definiton (Delphi 1 and maybe also 2) started from 01/01/0001 and was
later changed to todays 12/30/1899 to be COM compatible.

The use of different types, for Windows local and system time, requires
either a conversion when a UTC (system) time is assigned to a TDateTime
variable, or overloaded functions are required for dealing with such
different encodings. Currently the conversion from SystemTime (record)
into TDateTime (Double) makes the TDateTime contain the *local* time,
not the UTC time. That's why I wonder how you want to place an true UTC
time value into a TDateTime - can you give some code?


Huh? I still don't get your problem...

Nevertheless here is an example:

=== source begin ===

program utctest;

{$mode objfpc}{$H+}
{$apptype console}

uses
  Windows, SysUtils;

var
  st: TSystemTime;
  dt: TDateTime;
begin
  GetLocalTime(st);
  dt := SystemTimeToDateTime(st);
  Writeln(FormatDateTime('c', dt));
  GetSystemTime(st);
  dt := SystemTimeToDateTime(st);
  Writeln(FormatDateTime('c', dt));
  Readln;
end.

=== source end ===

As long as your time zone isn't UTC you will see two different times. For me the result was the following:

=== output begin ===

04.11.2011 11:48:16
04.11.2011 10:48:16

=== output end ===

And still: It does not matter whether we are talking about local or
UTC time here.

It does, as long as there is no guarantee that UTC and local time start
at the exactly same date and time.

The TDateTime type is completely timezone agnostic. It's integer part is the count of days since 12/30/1899 and it's fracture part is the part of 24 hours. So by definition there is no timezone. And TSystemTime is timezone agnonstic as well. It's just a struct that contains year, month, day, hour, minute, second and millisecond. It can even hold a UTC time or a local time (see the declaration of SystemTimeToTzSpecificLocalTime). So if you do a SystemTimeToTzSpecificLocalTime twice you'll get a result where the time is off by twice your timezone offset.

Regards,
Sven
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to