如何在Objective-C中将NSDate转换为Ticks格式?附示例与预期结果
在Objective-C中将NSDate转换为.NET风格Ticks格式
我来帮你搞定这个转换问题——你要的其实是把NSDate转换成**.NET风格的Ticks**(也就是从公元1年1月1日00:00:00 UTC开始,以100纳秒为单位的计数),你的预期结果正好符合这个规则。
先提一句:你给出的代码片段有个小语法错误,NSDate *date = NSDate *conversionDate = ... 这种写法是不对的,我会在下面的实现里修正这个问题。
完整实现代码
// 1. 初始化日期格式化器,解析目标日期字符串 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"dd-MM-yyyy HH:mm:ss"]; [dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; // 关键:基于UTC解析,避免时区偏差 NSDate *conversionDate = [dateFormat dateFromString:@"29-03-2018 00:00:00"]; // 2. 定义.NET Ticks的起始参考日期:0001-01-01 00:00:00 UTC NSDateFormatter *netEpochFormatter = [[NSDateFormatter alloc] init]; [netEpochFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; [netEpochFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; NSDate *netEpochDate = [netEpochFormatter dateFromString:@"0001-01-01 00:00:00"]; // 3. 计算两个参考日期的时间差:NSDate的参考点(2001-01-01 UTC)到.NET起始点的秒数 NSTimeInterval nsReferenceToNetEpoch = [[NSDate dateWithTimeIntervalSinceReferenceDate:0] timeIntervalSinceDate:netEpochDate]; // 4. 计算目标日期到NSDate参考点的秒数 NSTimeInterval targetToNSReference = [conversionDate timeIntervalSinceReferenceDate]; // 5. 总秒数 = 两个间隔之和,再转换为Ticks(1 Tick = 100纳秒 = 1e-7秒) long long totalTicks = (long long)((nsReferenceToNetEpoch + targetToNSReference) * 10000000LL); // 输出结果,和你的预期一致 NSLog(@"Ticks = %lld", totalTicks); // 打印:636579950240000000
关键细节说明
- 时区处理:一定要把日期格式化器的时区设置为UTC,因为NSDate本质是UTC时间,而.NET的Ticks也是基于UTC计算的,不这么做会导致时区偏移,结果出错。
- 数值类型:Ticks的数值极大,必须用
long long(64位整数)存储,否则会出现溢出问题;计算时用10000000LL确保是64位常量,避免整数截断。 - 参考日期差值:NSDate的默认参考点是2001年1月1日UTC,而.NET的Ticks参考点是公元1年1月1日UTC,所以我们需要先算出这两个参考点之间的时间差,再叠加目标日期到NSDate参考点的间隔。
额外注意
如果你的输入日期字符串是本地时区的,只需要调整dateFormat的timeZone为本地时区即可,但最终计算Ticks时,所有日期都要统一到UTC维度,保证结果准确。
内容的提问来源于stack exchange,提问作者Naveen Babu
相关产品推荐
相关产品推荐

