我将日期存储在MSSql
数据库中作为日期的偏移值。例如:8/2/14 12:25 AM
存储为41853.0178824074
。
如何从偏移值中取回日期?
您可以通过将Excel中的任何float
数字转换为日期来轻松获得此值。
感谢。
答案 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