【问题标题】:setting time when formatting date using NSDateformatter使用 NSDateformatter 格式化日期时设置时间
【发布时间】:2014-10-08 11:32:46
【问题描述】:

我有以下代码将字符串转换为日期。是否有可能将时间设置为“00:00:00”而不是当前时间?

NSDateFormatter *dateformat = [[NSDateFormatter alloc] init];
[dateformat setDateFormat:@"yyyy-MM-dd"];
NSString *str = @"2014-08-08";
NSDate *dt = [dateformat dateFromString:str];

这将 dt 设为“2014-08-08 15:20:00 +0000”,因为我在 15:20 进行了操作。

编辑:我稍后将使用此日期将其转换为整数以将其存储在数据库中:

int t = [dt timeIntervalSince1970];

【问题讨论】:

  • 什么样的数据库?核心数据?如果是这样,您不需要转换。无论哪种方式,这种转换都会很好。不过请确保您使用NSInteger
  • 整个问题都没有实际意义。你在做什么是正确的。为了获得字符串“2014-08-08 15:20:00 +0000”,您必须在某处显示它。这让你认为有一个错误。没有。欢迎与 NSDate 合作。处理 TimeZones 是您必须要做的事情。
  • sqlite 使用 FCModel 包装器。为什么使用 NSInteger 而不是 int?
  • NSInteger 将根据设备使用正确的 32/64 位版本。 int 在任一设备上都是 32 位 int。与 CGFloat 相同,而不是 float。等等......无论如何,只需使用您拥有的日期。它是正确的。时区差异让您认为它不正确。
  • How do I NSLog an NSDate?的可能重复

标签: ios iphone


【解决方案1】:

如果您使用 NSLog 显示日期 dt,您将看到日期描述方法提供的内容。如果您想以适合您的特定方式查看日期,请使用 NSDateFormatter 格式化日期。

例子:

NSDateFormatter *dateformat = [[NSDateFormatter alloc] init];
[dateformat setDateFormat:@"yyyy-MM-dd"];
NSString *str = @"2014-08-08";
NSDate *dt = [dateformat dateFromString:str];

NSDateFormatter *displayDateformat = [[NSDateFormatter alloc] init];
[displayDateformat setDateFormat:@"yyyy-MM-dd"];
NSString *displayDateString = [displayDateformat stringFromDate:dt];
NSLog(@"displayDateString: %@", displayDateString);

输出:

2014-08-08

根据 Apple 文档的说明:“此方法返回相对于绝对参考日期的时间值 - 格林威治标准时间 2001 年 1 月 1 日的第一时刻。”

【讨论】:

  • 哦等等。我现在明白了。我以为你是提问者。但是,这不会补偿设置为当前时间的时间。它会停止任何显示时间的字符串。
  • 你不需要第二个NSDateFormatter,你可以重复使用dateformat,因为dateformatdisplayDateformat的格式是一样的
  • 好的,是的,除了重复两个相同的日期格式化程序,这不是必需的,这是正确的。这是一个显示问题。
  • 我已经编辑了这个问题。我没有使用 NSLog 的日期,而是将其转换为整数以存储在数据库中。
【解决方案2】:

一个好的做法是使用 NSDateComponents

NSDate *yourDate = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:yourDate];
[calendar setTimeZone:[NSTimeZone localTimeZone]];
// Set the time components manually
[dateComponents setHour:0];
[dateComponents setMinute:0];
[dateComponents setSecond:0];            

yourDate = [calendar dateFromComponents:dateComponents];

更新

iOS8:

[[NSCalendar currentCalendar] startOfDayForDate:[NSDate date]];

【讨论】:

  • @Zaph 这也是正确的,但使用日期组件获得 +1,这是您应该做的。
  • 重点是没有解决显示格式问题。虽然它可能会更好,但它会产生与 OP 代码相同的结果。
  • @Zaph 问题是关于Is it possible that it sets time as "00:00:00" and not the current time 而不是格式化输出
  • +1 表示startOfDayForDate。对于 iOS8,NSCalendar 有很多补充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
相关资源
最近更新 更多