Rod*_*tro 6 java delphi time parsing date
我有一个服务器设备配置,我需要使用UDP更改装备日期配置.服务器是用Java和设备编写的,用Delphi编写.
所以,数据流是这样的:
Java server (Java date) -> UDP (integer date) -> Delphi equipment (Delphi date)
问题是,当我将日期作为整数传递时,java会计算1970年的毫秒数和德尔福数秒.我通过以下日期:today.getTime() / 1000但是设备将此理解为2008年的日期,当时我们在2012年.
我可以更改Java代码,但设备是第三方,我无法访问它的源代码.
Java和Delphi日期解析之间存在差异,允许这种差异吗?
编辑: 感谢MДΓΓБДLL我发现我被乘以1000,而不是由它划分,我现在有一个美好的约会,但仍然是错误的(2033年被somewhen,现在是2008年).
Delphi的DateUtils单位具有UnixToDateTime()和Unix时间戳DateTimeToUnix()之间转换的功能TDateTime,这些时间戳表示为Unix时代 (1970年1月1日00:00:00 GMT)的秒数:
// 1325606144 = Jan 3 2012 3:55:44 PM GMT
uses
DateUtils;
var
DT: TDateTime;
Unix: Int64;
begin
DT := UnixToDateTime(1325606144);
// returns Jan 3 2012 3:55:44 PM
Unix := DateTimeToUnix(EncodeDate(2012, 1, 3) + EncodeTime(15, 55, 44, 0));
// returns 1325606144
end;
Run Code Online (Sandbox Code Playgroud)
Date另一方面,Java的类基于Unix时代的毫秒数.但这很容易考虑到:
uses
DateUtils;
function JavaToDateTime(Value: Int64): TDateTime;
begin
Result := UnixToDateTime(Value div 1000);
end;
function DateTimeToJava(const Value: TDateTime): Int64;
begin
Result := DateTimeToUnix(Value) * 1000;
end;
Run Code Online (Sandbox Code Playgroud)
或者:
uses
SysUtils, DateUtils;
// UnixDateDelta is defined in SysUtils...
function JavaToDateTime(Value: Int64): TDateTime;
begin
Result := IncMilliSecond(UnixDateDelta, Value);
end;
function DateTimeToJava(const Value: TDateTime): Int64;
begin
Result := MilliSecondsBetween(UnixDateDelta, Value);
if Value < UnixDateDelta then
Result := -Result;
end;
Run Code Online (Sandbox Code Playgroud)
无论哪种方式:
// 1325606144000 = Jan 3 2012 3:55:44 PM GMT
var
DT: TDateTime;
Java: Int64;
begin
DT := JavaToDateTime(1325606144000);
// returns Jan 3 2012 3:55:44 PM
Java := DateTimeToJava(EncodeDate(2012, 1, 3) + EncodeTime(15, 55, 44, 0));
// returns 1325606144000
end;
Run Code Online (Sandbox Code Playgroud)
Unix时间戳与Java中使用的时间戳相同.另一方面,Delphi的TDateTime基于18/22/18上午12:01的开始日期(它是COM兼容性的东西),因此需要进行一些转换.这些功能会做到; 我还添加了一段快速的测试代码,以显示转换在两种方式下都能正常工作.
const
UnixStartDate = 25569.0;
function DateTimeToUnixTime(const ADateTime: TDateTime): Cardinal;
begin
Result := Round(ADateTime - UnixStartDate) * 86400;
end;
function UnixTimeToDateTime(const UnixDate: Cardinal): TDateTime;
begin
Result := UnixDate / 86400 + UnixStartDate;
end;
procedure TForm1.Button1Click(Sender: TObject);
var StartDate: TDateTime;
UnixDate: Cardinal;
begin
StartDate := Date();
Memo1.Lines.Add('Start Date: ' + DateToStr(StartDate));
UnixDate := DateTimeToUnixTime(StartDate);
Memo1.Lines.Add('DateTimeToUnixTime = ' + IntToStr(UnixDate));
Memo1.Lines.Add('UnixTimeToDateTime = ' + DateToStr(UnixTimeToDateTime(UnixDate)));
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3244 次 |
| 最近记录: |