perl – 为什么在8:30增加6天半小时到午夜?

前端之家收集整理的这篇文章主要介绍了perl – 为什么在8:30增加6天半小时到午夜?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
此示例采用基准日期并添加7½小时,1天7½小时,2天7½小时等等.
  1. use Date::Manip;
  2. use DateTime;
  3. use DateTime::Format::DateManip;
  4.  
  5. Date::Manip::Date_Init("TZ=America/New_York","Language=English");
  6.  
  7. my $otime = DateTime->new(
  8. year => 2013,month => 3,day => 4,hour => 0,minute => 0,second => 0,time_zone => 'America/New_York',);
  9.  
  10. my $t1 = UnixDate($otime,"%i:%M %p on %A,%B %e,%Y ");
  11. print "original $t1\n";
  12.  
  13. for (my $i = 0; $i <= 20; $i++) {
  14. my $dtw = $otime->clone();
  15. $dtw->add(
  16. minutes => (15) * 30,days => ($i),);
  17. $t1 = UnixDate($dtw,%Y ");
  18. print "$i days $t1\n";
  19. }

添加6天7½小时时,结果包含额外的小时.

  1. original 12:00 AM on Monday,March 04,2013
  2. 0 days 07:30 AM on Monday,2013
  3. 1 days 07:30 AM on Tuesday,March 05,2013
  4. 2 days 07:30 AM on Wednesday,March 06,2013
  5. 3 days 07:30 AM on Thursday,March 07,2013
  6. 4 days 07:30 AM on Friday,March 08,2013
  7. 5 days 07:30 AM on Saturday,March 09,2013
  8. 6 days 08:30 AM on Sunday,March 10,2013 # why 8:30 and not 7:30?
  9. 7 days 07:30 AM on Monday,March 11,2013
  10. 8 days 07:30 AM on Tuesday,March 12,2013
  11. 9 days 07:30 AM on Wednesday,March 13,2013
  12. 10 days 07:30 AM on Thursday,March 14,2013
  13. 11 days 07:30 AM on Friday,March 15,2013
  14. 12 days 07:30 AM on Saturday,March 16,2013
  15. 13 days 07:30 AM on Sunday,March 17,2013
  16. 14 days 07:30 AM on Monday,March 18,2013
  17. 15 days 07:30 AM on Tuesday,March 19,2013
  18. 16 days 07:30 AM on Wednesday,March 20,2013
  19. 17 days 07:30 AM on Thursday,March 21,2013
  20. 18 days 07:30 AM on Friday,March 22,2013
  21. 19 days 07:30 AM on Saturday,March 23,2013
  22. 20 days 07:30 AM on Sunday,March 24,2013

解决方法

因为夏令时开始于2013年3月10日在America / New_York时区. DateTime首先增加$i天(3月10日午夜)然后增加450分钟到达8:30 AM(因为3月10日凌晨1点59分之前的分钟是凌晨3点).要添加的参数顺序没有意义;见 Adding a Duration to a Datetime.

因为它增加了几天和几天分开处理(并处理第一天),效果仅发生在DST实际开始或结束的日期.如果你想要一个特定的时间,只需直接设置它而不是使用add.或者调用添加两次,一次添加分钟,然后再添加几天.

猜你在找的Perl相关文章