为什么Excel的序列日期时间要提前两天零一小时零40分钟才能转换为NSDate?

艾丽斯·范·洛伊(Elise van Looij)

我正在将日期从Excel电子表格转换为NSDate的日期,但是由于某些原因,它们总是提前两天出现:星期日是星期二,等等。

我的转换方法基于cpearson.com的以下信息

Excel将日期和时间存储为一个数字,表示自1900年1月0日以来的天数,再加上一个24小时工作日的一个小数部分:
ddddd.tttttt。这称为序列日期或序列日期时间。(...)数字的整数部分ddddd表示自1900年1月0日以来的天数。(...)数字的小数部分ttttt表示一天24小时的小数部分。例如,6:00 AM被存储为0.25,或一天24小时的25%。同样,下午6点存储的时间为一天24小时的0.75,即75%。

- (NSDate *)dateFromExcelSerialDate:(double)serialdate
{
    if (serialdate == 0)
        return nil;

    NSTimeInterval theTimeInterval;
    NSInteger numberOfSecondsInOneDay = 86400;

    double integral;
    double fractional = modf(serialdate, &integral);

    NSLog(@"%@ %@ \r serialdate = %f, integral = %f, fractional = %f",
          [self class], NSStringFromSelector(_cmd),
          serialdate, integral, fractional);

    theTimeInterval = integral * numberOfSecondsInOneDay; //number of days
    if (fractional > 0) {
        theTimeInterval += numberOfSecondsInOneDay / fractional; //portion of one day
    }

    NSCalendar *nl_gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSTimeZone *nl_timezone = [[NSTimeZone alloc] initWithName:@"Europe/Amsterdam"];
    [nl_gregorianCalendar setTimeZone:nl_timezone];

    NSDateComponents *excelBaseDateComps = [[NSDateComponents alloc] init];
    [excelBaseDateComps setMonth:1];
    [excelBaseDateComps setDay:1];
    [excelBaseDateComps setHour:00];
    [excelBaseDateComps setMinute:00];
    [excelBaseDateComps setTimeZone:nl_timezone];
    [excelBaseDateComps setYear:1900];
    NSDate *excelBaseDate = [nl_gregorianCalendar dateFromComponents:excelBaseDateComps];

    NSDate *inputDate = [NSDate dateWithTimeInterval:theTimeInterval sinceDate:excelBaseDate];

    NSLog(@"%@ %@ \r serialdate %f, theTimeInterval = %f \r inputDate = %@",
          [self class], NSStringFromSelector(_cmd),
          serialdate, theTimeInterval,
          [self.nl_dateFormatter stringFromDate:inputDate]);

    return inputDate;
}

该电子表格是在荷兰生产的,大概是在荷兰版本的Microsoft Excel上生成的。电子表格日期2014年7月6日星期日00:00产生以下结果:dateFromExcelSerialDate:

serialdate = 41826.000000,integral = 41826.000000,小数= 0.000000 theTimeInterval = 3613766400.000000 inputDate = 08 jul。2014年01:40

同样,2014年7月13日,星期日,00:00产生:

序列日期= 41833.000000,整数= 41833.000000,分数= 0.000000 theTimeInterval = 3614371200.000000 inputDate = 15七月。2014年01:40

我可以通过减去2天1小时40分钟来更正输出:

theTimeInterval -= ((60 * 60 * 24 * 2) + (60*60) + (60*40));

但我不知道那有多健壮。

两天的时间差使我认为它与year年修正有关,因此我尝试通过将nsTimeInterval秒添加到excelBaseDate中,让日历进行计算,如下所示:

NSDateComponents *comps = [[NSDateComponents alloc] init];
         [comps setSecond:theInterval];
         NSDate *inputDate = [nl_gregorianCalendar dateByAddingComponents:comps
         toDate:excelBaseDate
         options:0];

奇怪的是,这给了我1870年代的约会。谁知道发生了什么事?

这里有两件事:

  1. 您的开始日期是,1900-Jan-1但您引荐的描述清楚地表明:参考是1900-Jan-0您可以在这里增加一天

  2. 1900年不是a年-您可以在这里增加一天

我想,这几乎就是您每次都多休息两天的原因。


Microsoft知道这一点,在此处查看有关该主题的更多信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Excel 将分钟转换为 100 分之一小时

来自分类Dev

回调函数总计一小时和一分钟的时间

来自分类Dev

将日期转换为unix时间戳时增加一小时

来自分类Dev

如何将“ 1天,14小时,16分钟”之类的文本转换为时间格式?

来自分类Dev

小时/分钟使用 lubridate 从日期时间增加一小时

来自分类Dev

为什么MySQL时间差异跨越小时边界两次返回大于一小时?

来自分类Dev

将日期转换为四分之一小时类型JAVA

来自分类Dev

如何在日期时间本地输入中将分钟添加到一小时?

来自分类Dev

R将数据帧字符串列转换为日期时间,且位数为一小时

来自分类Dev

R将数据帧字符串列转换为日期时间,且位数为一小时

来自分类Dev

计算页面加载到下一小时的第一分钟之间的秒数

来自分类Dev

SQL将转换时间转换为一小时增量

来自分类Dev

SQL将转换时间转换为一小时增量

来自分类Dev

将熊猫的日期时间转换为小时:分钟四舍五入到15分钟

来自分类Dev

前两天 dax

来自分类Dev

两个日期/时间之间特定的一小时周期数

来自分类Dev

降低时间序列的频率并在夏令时保持一天中的同一小时R

来自分类Dev

为什么反应时间增加一小时?

来自分类Dev

为什么javascript新的Date根据日期格式增加一小时

来自分类Dev

在SQL Server中将15分钟的时间序列转换为10分钟的时间序列

来自分类Dev

四分之一小时内每30分钟执行一次Cron表达?

来自分类Dev

使用Python将当前时间提前一小时

来自分类Dev

时间API点组织会提前一小时吗?

来自分类Dev

payara 服务器托管的 eclipselink 日期提前一小时从 postgres 读取

来自分类Dev

php将时间戳转换为秒(2小时12分钟或2:12:00)

来自分类Dev

如何将15分钟数据转换为每小时以熊猫为单位的时间?

来自分类Dev

从 unix 值中获取前一小时/前一天的时间戳

来自分类Dev

将日期序列化为JSON似乎在一小时后更改了日期

来自分类Dev

熊猫:时间序列数据:如何选择一个小时,一天或一分钟的行?

Related 相关文章

  1. 1

    使用 Excel 将分钟转换为 100 分之一小时

  2. 2

    回调函数总计一小时和一分钟的时间

  3. 3

    将日期转换为unix时间戳时增加一小时

  4. 4

    如何将“ 1天,14小时,16分钟”之类的文本转换为时间格式?

  5. 5

    小时/分钟使用 lubridate 从日期时间增加一小时

  6. 6

    为什么MySQL时间差异跨越小时边界两次返回大于一小时?

  7. 7

    将日期转换为四分之一小时类型JAVA

  8. 8

    如何在日期时间本地输入中将分钟添加到一小时?

  9. 9

    R将数据帧字符串列转换为日期时间,且位数为一小时

  10. 10

    R将数据帧字符串列转换为日期时间,且位数为一小时

  11. 11

    计算页面加载到下一小时的第一分钟之间的秒数

  12. 12

    SQL将转换时间转换为一小时增量

  13. 13

    SQL将转换时间转换为一小时增量

  14. 14

    将熊猫的日期时间转换为小时:分钟四舍五入到15分钟

  15. 15

    前两天 dax

  16. 16

    两个日期/时间之间特定的一小时周期数

  17. 17

    降低时间序列的频率并在夏令时保持一天中的同一小时R

  18. 18

    为什么反应时间增加一小时?

  19. 19

    为什么javascript新的Date根据日期格式增加一小时

  20. 20

    在SQL Server中将15分钟的时间序列转换为10分钟的时间序列

  21. 21

    四分之一小时内每30分钟执行一次Cron表达?

  22. 22

    使用Python将当前时间提前一小时

  23. 23

    时间API点组织会提前一小时吗?

  24. 24

    payara 服务器托管的 eclipselink 日期提前一小时从 postgres 读取

  25. 25

    php将时间戳转换为秒(2小时12分钟或2:12:00)

  26. 26

    如何将15分钟数据转换为每小时以熊猫为单位的时间?

  27. 27

    从 unix 值中获取前一小时/前一天的时间戳

  28. 28

    将日期序列化为JSON似乎在一小时后更改了日期

  29. 29

    熊猫:时间序列数据:如何选择一个小时,一天或一分钟的行?

热门标签

归档