Цель 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