- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要通过 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 上有完整记录。 :
The
TDateTime
class inherits a val data member--declared as a double--that holds the date-time value. The integral part of aTDateTime
value is the number of days that have passed since December 30, 1899. The fractional part of aTDateTime
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 日的天数。 , TDateTime
值 25569.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/
我的问题简而言之:TDateTime A (03.09.2014 13:40) - TDateTime B (03.09.2014 13:40) = -1 我有两个要比较的 TDateTime 值,首
我想将秒添加到 TDateTime 变量中,以便结果是分钟的顶部。例如,如果是 08:30:25,我想更改 TDateTime 变量来存储 08:31:00。 我看到 TDateTime 有一个 De
我正在执行一个长循环,下载数千个文件。我想显示估计的剩余时间,因为这可能需要几个小时。然而,根据我所写的内容,我得到了平均毫秒。如何将此平均下载时间从毫秒转换为 TDateTime? 看看我在哪里设置
Delphi 5 中是否有任何方法可以将字符串转换为 TDateTime,您可以在其中指定要使用的实际格式? 我正在开发一个作业处理器,它接受来自各个工作站的任务。这些任务有一系列参数,其中一些是日期
我正在使用 C++ Builder 并收到以下错误: [ILINK32 Error] Error: Unresolved external '__fastcall System::Internal::
我正在为 FMX TGrid 编写列和单元格类,它将在每个单元格中包含 TCalendarEdit 和 TTimeEdit 实例。除了正确处理这些子控件中所做的更改外,一切正常。 type TFM
似乎无法将 NULL 分配给 TDateTime 变量(“未分配值”)。 我想象的唯一方法是使用这样的东西: function isNull(aDate : TDateTime) : boolean;
正在寻找返回两个 TDateTime 值之间的秒差的代码示例。具体来说,我试图比较两个 TDateTime 值,如果大于第二个阈值,它将运行特定方法。 谢谢! 最佳答案 尝试SecondsBetwee
有没有办法检查Delphi是否TDateTime变量具有有效内容而不会捕获转换异常? 我编写了一个应用程序,必须解析数百个以原始 Delphi 记录形式编写的大文件,其中包含 TDateTime fi
我需要通过 AJAX 向 delphi 服务器发送一个日期,该服务器接受浮点格式的日期并设置 TDateTime 属性。 例如。 var date: TDateTime; begin da
我正在使用 C++ Builder 并有以下问题: 我想检测一个日期/时间是否晚于另一个日期/时间,以及晚了多少。 这是我当前的代码: TDateTime testFirstDate("11/09/2
我在将日期设置为 TDateTime 变量时遇到问题。 我已经试过了,没有运气: TDateTime Mine; Mine = ("12/05/1990"); 我该怎么做? 这段代码有什么问题: TD
我正在使用 C++ 开发预约系统。 能否请我帮忙将字符串转换为 TDateTime 变量。 这是一个我希望得到帮助的示例; TDateTime appDateTime(2012, 9, 15, 14,
我正在使用 C++ Builder,我需要一些帮助来查看两次是否相同。 这是我的代码: TDateTime appDateFromVector = TimeOf(appointmentsForFind
我正在使用 C++ 并使用 TDateTime 数据类型。 如何获取当前系统日期/时间并将其放入 TDateTime 变量? 最佳答案 正如 Jesse 提到的,您可以使用 Now() 函数(或静态
我正在使用 C++ Builder 并使用 TDateTime 数据类型创建 GUI 应用程序。 当我在 TDateTime 对象上使用 MonthOf() 方法时,我得到的值比 TDateTime
我正在尝试为 Tdatetime 编写一个函数(但是当我打开我的程序时,他必须显示现在的数据) 下面我有一个函数用于 TDatetime 但我有一个错误: ((((''DecodeDateTime(d
我有一个对象,它有一个值,但该值可以是 integer , string , boolean或TDateTime 。所以,它是 Variant . 我使用VarType()检查其类型,但自 VarTy
无论用户的本地时区设置为何,使用 Delphi 2007,我都需要确定东部时区的时间 (TDateTime)。 我怎样才能做到这一点?当然,需要了解夏令时。 最佳答案 如果我理解正确,您需要相当于当前
我需要将 TDateTime 转换为具有微秒精度的String。如果是毫秒精度,可以使用格式: DateTimeToString(Result, 'd.m.yyyy hh:nn:ss.zzz', da
我是一名优秀的程序员,十分优秀!