Цель c: получить дату из значения смещения даты

У меня есть даты, хранящиеся в моем MSSql База данных в качестве значения смещения даты. Например: 8/2/14 12:25 AM хранится как 41853.0178824074,

Как я могу получить дату обратно из ее значения смещения?
Вы можете легко получить это значение, преобразовав любой float номер в excel на сегодняшний день.

Благодарю.

1 ответ

Решение

Вот рабочий пример создания NSDate Объект из даты смещения Excel, включая код для обхода ошибки високосного года, представленной в 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
Другие вопросы по тегам