目标c:从日期偏移值获取日期

时间:2014-08-04 09:58:52

标签: ios objective-c date offset

我将日期存储在MSSql数据库中作为日期的偏移值。例如:8/2/14 12:25 AM存储为41853.0178824074

如何从偏移值中取回日期?
您可以通过将Excel中的任何float数字转换为日期来轻松获得此值。

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个从Excel偏移日期创建NSDate对象的工作示例,包括解决Excel中存在的闰年错误的代码:

#import <Foundation/Foundation.h>

NSDate *dateFromExcelSerialDate(double serialdate)
{
    if (serialdate > 31 + 28)
        serialdate -= 1.0;      // Fix Excel bug where it thinks 1900 is a leap year
    const NSTimeInterval numberOfSecondsInOneDay = 86400;
    NSTimeInterval theTimeInterval = serialdate * numberOfSecondsInOneDay; //number of days
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    [calendar setTimeZone:timeZone];

    NSDateComponents *excelBaseDateComps = [[NSDateComponents alloc] init];
    [excelBaseDateComps setYear:1900];
    [excelBaseDateComps setMonth:1];
    [excelBaseDateComps setDay:0];
    [excelBaseDateComps setHour:0];
    [excelBaseDateComps setMinute:0];
    [excelBaseDateComps setSecond:0];
    [excelBaseDateComps setTimeZone:timeZone];
    NSDate *excelBaseDate = [calendar dateFromComponents:excelBaseDateComps];

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

    return inputDate;
}

int main(int argc, const char **argv) {
    @autoreleasepool {
        for (int i = 1; i < argc; i++) {
            char *endptr;
            double d = strtod(argv[i], &endptr);
            if (endptr && *endptr == '\0') {
                NSDate *date = dateFromExcelSerialDate(d);
                NSLog(@"%@", date);
            } else {
                NSLog(@"Ignoring invalid double value '%s'", argv[i]);
            }
        }
    }    
    return 0;
}

它是作为Foundation命令行实用程序编写的,并使用以下代码编译:

clang -DDEBUG=1 -g -fobjc-arc -Wall -o excelnsdate excelnsdate.m -framework Foundation

这是您使用您在问题中提供的值生成的内容:

./excelnsdate 41853.0178824074
2014-08-04 11:18:04.766 excelnsdate[91305:507] 2014-08-02 00:25:45 +0000