gpt4 book ai didi

JavaScript 日期转 Delphi TDateTime

转载 作者:行者123 更新时间:2023-12-01 00:48:29 34 4
gpt4 key购买 nike

我需要通过 AJAX 向 delphi 服务器发送一个日期,该服务器接受浮点格式的日期并设置 TDateTime 属性。

例如。

var
date: TDateTime;
begin
date := StrToFloat(Request.QueryFields.Values['date']);
end;

Delphi TDateTime 从 1989 年 12 月 30 日开始,我已经测试过:

var
date: TDateTime;
begin
date := StrToFloat('0');
ShowMessage( DateTimeToStr(date) ); // show: 30/12/1899
end;

JavaScript日期从unix纪元开始,我已经测试过:

console.log(new Date(0)); // Thu Jan 01 1970 01:00:00 GMT+0100

一个简单的转换似乎减去了差异,但不起作用,例如:

// javascipt
var delphiTime = (new Date("07-24-2019") - new Date("12-30-1899")) / 1000;
console.log(delphiTime ); // 3773084400


// delphi
ShowMessage( DateTimeToStr(3773084400) ); // show 00/00/00

奇怪的事实,在delphi上,现在是43670.654378:

ShowMessage( FloatToStr(Now) ); // 43670.654378

在delphi中0是1899,43670是2019...

Delphi 中的日期格式如何工作以及如何使用数学将 unix 日期转换为 Delphi 日期?

旁注:我无法修改服务器,我需要使用 javascript 解决客户端问题

更新:

在 Delphi 中,浮点值 = 1 为 31.12.1899,2 = 01.01.1900 等等。每个单元就像一天。

function jsDateToDelphiDate(date){
const seconds = (new Date(date).getTime() - new Date("12-30-1899").getTime()) / 1000;
const days = seconds / 60 / 60 / 24;
return days;
}

console.log(jsDateToDelphiDate(new Date("07-24-2019 16:00:00"))); // 43670.625

43670.625 在 delphi 上是 23/07/2019 15:00

为什么我损失了 1 个小时?

最佳答案

How works the date format in Delphi

这在 Embarcadero's DocWiki 上有完整记录。 :

System.TDateTime

The TDateTime class inherits a val data member--declared as a double--that holds the date-time value. The integral part of a TDateTime value is the number of days that have passed since December 30, 1899. The fractional part of a TDateTime value is the time of day.

...

The following table displays examples of TDateTime values and their corresponding dates and times:

Value     Description  0         December 30, 1899; 12:00 A.M.  2.75      January 1, 1900; 6:00 P.M.  -1.25     December 29, 1899; 6:00 A.M.  35065     January 1, 1996; 12:00 A.M.

how convert a unix date to delphi date with math?

Side note: i can't modify the server, i need to solve the issue client side with javascript

Unix 日期/时间表示为自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。 Delphi 在 SysUtils 单元中有一个 UnixDateDelta 常量,它被定义为 25569,即从 1899 年 12 月 31 日到 1970 年 1 月 1 日的天数。 , TDateTime25569.0 精确表示 1970 年 1 月 1 日 00:00:00(UTC 与本地时间由您在创建 TDateTime 时决定) >)。然后,您可以向该值添加秒,以获得任何 Unix 日期/时间的最终 TDateTime 值。

TDateTime中,您可以将整天添加到整数部分(即Unix + 1天= 25569.0 + 1 = 25570.0),但在一个时间段内添加秒一天的工作量稍微多一些,因为秒在 TDateTime 中并未按原样表示,如上表所示。 0.25 为上午 6:00(午夜后 21600 秒),0.75 为下午 6:00(午夜后 64800 秒)。因此,秒在 TDateTime 中表示为以 86400(一天中的秒数)作为分母的分数。

JavaScript Date 对象表示为自 1970 年 1 月 1 日午夜以来的毫秒数。您可以将 Date 值除以 1000 以获得整秒,然后除以该值乘以 86400 即可获得整日和秒的小数部分,然后您可以将其添加到 25569.0 以生成 TDateTime 值。

function jsDateToDelphiDate(dateToConvert){
const UnixDateDelta = 25569.0;
const SecsPerDay = 86400;
const MSecsPerSec = 1000;
var UnixSeconds = dateToConvert.getTime() / MSecsPerSec; // 1563984000
var SecsToAdd = UnixSeconds / SecsPerDay; // 18101.666666666668
return UnixDateDelta + SecsToAdd;
}

// don't forget to force UTC, or else the Date value
// will be skewed by the local timezone offset...
console.log(jsDateToDelphiDate(new Date("2019-07-24T16:00:00Z"))); // 43670.66666666667
console.log(jsDateToDelphiDate(new Date(Date.UTC(2019, 6, 24, 16, 0, 0)))); // 43670.66666666667

德尔福有一个 UnixToDateTime() DateUtils 单元中的函数为您执行此计算。因此,如果您可以更改 AJAX 代码以将 Unix 时间戳按原样传递给 Delphi,则可以让 Delphi 计算合适的 TDateTime

请注意,在此示例中,生成的 TDateTime 值采用 UTC 格式。通过 AJAX 将值传输到 Delphi 后,如果您的 Delphi 代码需要本地时间的 TDateTime,则可以根据本地计算机的时区偏移量调整 TDateTime 进行简单的计算只需几分钟,您就可以使用平台 API 获得这些信息,例如 GetTimeZoneInformation()在Windows等上。Delphi有一个IncMinute()您可以使用 DateUtils 单元中的函数进行该调整。

关于JavaScript 日期转 Delphi TDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57184472/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com