【问题标题】:How add milliseconds in NSDate?如何在 NSDate 中添加毫秒?
【发布时间】:2015-12-15 13:19:55
【问题描述】:

我有一个核心数据,我有一个名为 time 的实体的属性 NSDate 类型,其中包含在商店中添加的时间。

当我尝试提取数据时,我需要按附加时间排序,并且我使用的是NSSortDescriptor。我的问题是当我有两个或多个相同时间的条目时:

time = "2015-12-15 12:48:08 +0000";
time = "2015-12-15 12:48:08 +0000";
time = "2015-12-15 12:48:09 +0000";
time = "2015-12-15 12:48:09 +0000";

这里的订单将丢失,因为我在NSDate 中没有毫秒数。

我该如何解决这个问题?

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"time"
                                                               ascending:YES];

[request setSortDescriptors:@[sortDescriptor]];
NSError *error;

NSArray *arr =[context executeFetchRequest:request error:&error];

编辑! 声明:

@property (nonatomic, retain) NSDate * time;

初始化:

newContact.time = [NSDate date];

第二种类型的初始化是:

NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];
[dateformatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[dateformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
NSString *timeString = [dateformatter stringFromDate:[NSDate date]]    

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];

NSDate *sentTime = [dateFormatter dateFromString:timeString];
newContact.time = sentTime;

【问题讨论】:

  • 您能告诉我们如何在NSDate 中添加年、月、日、小时、分钟和秒吗?
  • 假设原始输入具有该分辨率,NSDate 包含毫秒。 time 真的是 NSDate 还是 NSString
  • 我对您的问题进行了编辑

标签: ios objective-c nsdate nssortdescriptor


【解决方案1】:

NSDate 确实包含毫秒。

日期对象是不可变的,代表一个不变的时间间隔 相对于绝对参考日期(1 月 1 日 00:00:00 UTC 2001)。

此参考日期的单位是NSTimeInterval,即double,小数部分包含毫秒。

NSTimeInterval 总是以秒为单位指定;它产生 10,000 年范围内的亚毫秒精度。

NSDate 是通过 NSTimeInterval 使用他指定的初始化器-initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds 创建的。如果我一个接一个地调用此方法,会发生以下情况:

        var interval = NSDate.timeIntervalSinceReferenceDate()
        print("\(interval)")
        interval = NSDate.timeIntervalSinceReferenceDate()
        print("\(interval)")

//        471879256.255005
//        471879256.259943

现在,CoreData 可以直接保存 NSDate 对象,我的问题是:

  • 您保存的是 NSDate 还是格式化的字符串?
  • 这些日期是如何创建的?从字符串?如果它们来自字符串,您是否正确阅读它们?
  • 注意你打印的是一个字符串表示,如果你想打印真正的值你应该问-timeIntervalSinceReferenceDate属性,你可以确定描述符是通过使用它来排序的。


我真的怀疑 CoreData 是否保存 NSDate 四舍五入的值。

【讨论】:

  • 在 sentTime 创建后立即写入并检查它是否具有十进制值 NSLog(@"Interval %lf", sentTime.timeIntervalSinceReferenceDate);如果日期格式不是错误的,或者您尝试在 NSDate 中转换的字符串不会暴露毫秒
  • 间隔471881576.851000,所以呢?
  • 你可以看到它确实包含毫秒,一切似乎都是正确的,也许问题出在其他地方。要检查排序器是否正确排序,我会打印 timeintervalsincerefdate 而不是日期描述。
  • 可以看到NSSortDescriptor是如何创建的。知道问题出在哪里吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2015-03-03
  • 2020-03-01
  • 1970-01-01
  • 2013-03-27
  • 2013-01-27
相关资源
最近更新 更多