Delphi 以年、月、日日期时间格式转换天

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 //

我研究了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 
           // 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;