如何从TDateTimePicker读取日期和时间

Ets*_*liv 1 delphi datetime datetimepicker datetime-format delphi-xe7

我真的很困惑.我想做的事情(看起来很简单)是在TDateTimePicker中显示日期+时间,并集成日历,并且能够在其值发生变化后读取它.

我想使用dd/MM/yyyy hh:mm格式.

由于TDateTimePicker不是TDateOrTimePicker,因此使用的是:

  • 种类:dtkDate(显示日历)
  • 格式:'dd/MM/yyyy hh:mm'

看起来很好,现在让我们读一读:

showmessage(DateTimeToStr(DateTimePicker1.Date)); 
Run Code Online (Sandbox Code Playgroud)

仅正确显示日期.不考虑hh:mm部分的变化.我总是得到默认值.然后我想:还有一个Time属性,也许我需要读取2次的值.

 showmessage(DateTimeToStr(DateTimePicker1.Time));
 showmessage(DateTimeToStr(DateTimePicker1.Date));
Run Code Online (Sandbox Code Playgroud)

但我有与以前完全相同的输出(和问题).所以现在,让我们尝试将此Kind属性更改为dtkTime,然后读取时间,然后将其切换回dtkDate,然后读取日期.

但不,它仍然无效.将Kind属性从dtkDate切换到dtkTime会删除hh:mm部分的输入.


我知道我实际上应该使用2个TDateTimePickers:一个用于日期,一个用于时间.

所以我的问题是:

  • 有没有一种简单的方法来解决我的简单和非常常见的问题(一个真正的DateTimePicker)?

还有一个Delphi设计问题:

  • 为什么Format属性基本上没用且误导?拥有TimeFormat,DateFormat和正确的格式验证过程并不难.

请注意,我发布这个问题主要是为了避免初学者做同样的调试和挫折的过程.

Rem*_*eau 6

我想做的事情(看起来很简单)是在TDateTimePicker中显示日期+时间,并集成日历,并且能够在其值发生变化后读取它.

我想使用dd/MM/yyyy hh:mm格式

对不起,但你不能.A TDateTimePicker只能用于日期或时间,但不能同时使用.

如果将Kind属性设置为dtkDate,则可以指定自定义DATE格式,但忽略任何TIME格式,并且Time未定义使用该属性.

如果将Kind属性设置为dtkTime,则可以指定自定义TIME格式,但忽略任何DATE格式,并且Date未定义使用该属性.

读取Date属性时,只有值的DATE部分有效.在一个完美的世界中,TIME部分将始终为零,但我看到它有时会包含垃圾.但是,您可以使用以下DateUtils.DateOf()函数轻松忽略:

Value := DateOf(DateTimePicker1.Date);
Run Code Online (Sandbox Code Playgroud)

Time属性和值的DATE部分相同.您可以使用该DateUtils.TimeOf()函数忽略任何潜在的垃圾:

Value := TimeOf(DateTimePicker1.Time);
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法来解决我的简单和非常常见的问题(一个真正的DateTimePicker)?

唯一真正的解决方案TDateTimePicker是使用两个独立的TDateTimePicker控件,一个用于日期,另一个用于日期.您可以在需要时将两个值组合在一起:

Value := DateOf(DateTimePicker1.Date) + TimeOf(DateTimePicker2.Time)
Run Code Online (Sandbox Code Playgroud)

如果你想显示一个TDateTime,只需反过来:

DateTimePicker1.Date := DateOf(Value);
DateTimePicker2.Time := TimeOf(Value);
Run Code Online (Sandbox Code Playgroud)

否则,找到支持您需要的第三方选择器(或编写自己的选择器).

为什么Format属性基本上没用且误导?

它没有用处和误导.它非常有用,但仅限于当前Kind设置的范围内.

拥有TimeFormat,DateFormat和正确的格式验证过程并不难.

TDateTimePicker它只是Win32 Date和Time Picker控件的一个瘦包装,它没有这样的功能.当然,他们可以编写自定义逻辑,以允许在Kind保留不同设置的值之间切换,但这并不是真正意味着如何使用DTP控件.您可以根据需要设置Kind一次,Format一次,然后处理输入和输出.不来回切换.仅仅因为你可以Kind动态切换并不意味着你应该.如果您认为编写这样的自定义逻辑很容易,欢迎您使用自己的代码.