Delphi 以年、月、日日期时间格式转换天
我研究了TDateTime函数和过程,但没有发现允许我转换等效年、月、日的天数的方法,例如,如果我的天数=0,我应该得到以下结果:Delphi 以年、月、日日期时间格式转换天,delphi,delphi-xe2,Delphi,Delphi Xe2,我研究了TDateTime函数和过程,但没有发现允许我转换等效年、月、日的天数的方法,例如,如果我的天数=0,我应该得到以下结果: Year: 0 Month: 0 Day: 0 或者我有天=1,应该有: Year: 0 Month: 0 Day: 1 // Just 1 day 或者如果我有天=32: Year: 0 Month: 1 // January is 31 days Day: 1 // Day is 1 //
Year: 0
Month: 0
Day: 0
或者我有天=1,应该有:
Year: 0
Month: 0
Day: 1 // Just 1 day
或者如果我有天=32:
Year: 0
Month: 1 // January is 31 days
Day: 1 // Day is 1
// Total are 32 days
等等,考虑到二月是29天,而不是28天。
在delphi xe2中,谁能告诉我该使用什么函数,或者是否需要手动编写?非常感谢。我不太明白你的问题 如果要翻译天数(在某些时间范围内): 没有什么是完全一样的,原因很简单,它不会被很好地定义,因为你给出的原因:不是每个月都有相同的天数。因此,输入不能仅为天数。例如,如果输入“35天”,结果应该是什么?是“1个月4天”还是“1个月5天”、“1个月6天”还是“1个月7天”?相反,您需要指定初始日期和结束日期 现在,在
DateUtils
中,在之间有天,在之间有月,在之间有年,但这些只是近似值
如果你能接受近似值,这很容易:年数等于天数的整数部分除以365.24,月数等于小数部分乘以12,依此类推
如果您希望获得某一年的第n天:
使用DateUtils中的方法:
procedure daysToDate(days: Integer; out day, month, year: Integer);
var
january1st: TDateTime;
targetDate: TDateTime;
begin
january1st := StartOfTheYear(Now());
targetDate := IncDay(january1st, days);
day := DayOfTheMonth(targetDate) - 1;
month := MonthOfTheYear(targetDate) - 1;
year := YearOf(targetDate) - YearOf(january1st);
end;
此代码假定您正在计算当前年份中的天数。如果希望在不同的年份开始,请修改行january1st:=startotheyear(Now())代码>根据需要。您应该询问有关标签的问题。您的问题可能有几种解释。谢谢,关于过滤器的问题已解决:)@Marcello:如果是这样,您的问题的预期解释与最自然的解释不同……不,是关于计数器的问题已解决。实际上,我想将一个整数(表示毫秒)转换成datetime格式,等价于年、月、日、小时、分钟、秒和毫秒。我试过encodetime,它在小时、分钟、秒和毫秒内都能正常工作,但encodetime不起作用。例如,在一天内有86400000毫秒,然后我确定encodedate将我的值改为1大约天,但它的值是错误的。@Marcello:您可以简单地使用TimestaToDateTime(MSecsToTimeStamp(MSecs))
其中MSecs
是毫秒数。它不适用于Encode*函数,因为它们以单词作为参数,86400000会导致溢出。@Chris,您好。我已经尝试过了,但是我看到它返回了这个异常。例如,如果我将毫秒设置为999,则会出现以下异常:EConvertError:“0.999”不是有效的时间戳;在这种情况下,我可以解决这个异常吗?@Marcello:你说得对-MSecsToTimeStamp
返回一个无效的TTimeStamp
。我认为这是由于不正确的实现(根据帮助,日期字段上肯定缺少+1)。很抱歉,在这种情况下,请使用我上面提供的代码(如果您希望以0000年开始,您也可以将负TDateTime值指定为起始年)。您好,这是真的,我假设初始日期为0(年=0,月0,日=0)。Datetime是一个真实的值,我看到将Datetime变量设置为0.9999999会使我变为23小时、59分钟、59秒和999毫秒;因此,我认为将其设置为1.0000000等于1天、0个月、0年,但对我来说,返回1899年、12个月、30天当然是错误的(对于我的情况)。如果我已经理解了它对于Delphi的第一个日期是可用的。@马塞洛:你应该考虑阅读帮助文章;是的,克里斯,事实上我明白了,因为结果就是这样,在那里读书。
procedure daysToDate(days: Integer; out day, month, year: Integer);
var
january1st: TDateTime;
targetDate: TDateTime;
begin
january1st := StartOfTheYear(Now());
targetDate := IncDay(january1st, days);
day := DayOfTheMonth(targetDate) - 1;
month := MonthOfTheYear(targetDate) - 1;
year := YearOf(targetDate) - YearOf(january1st);
end;