12

[NSDate 日付] から 00:00 (その日の始まり) の NSDate オブジェクトを取得する必要があります。現在、2012 年 1 月 6 日の午前 11 時 30 分 ([NSDate 日付] によって返される) であるとします。 2012 年 1 月 6 日の午前 0 時の NSDate が必要です。

私はこれを試していませんが、私の考えは次のとおりです。

NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
NSDate *morningStart = [calendar dateFromComponents:components];

したがって、最初に現在の日付 (2012 年 1 月 6 日とします) を取得し、日付の NSDateComponent を作成してから、時/分/秒を 0 に設定し、年/月/日は変更しないでください (つまり、01 /06/2012) 次に、このコンポーネント設定の NSDate を作成し、00:00:00 01/06/2012 の日付を取得できますか?

4

3 に答える 3

10

あなたがしていることは正しいですが、NSLog morningStart の日付は GMT タイムゾーンで表示されます

日付が正しいことを確認したい場合は、NSStringに変換してください

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
 [formatter setDateFormat:@"yyyy-MMM-dd HH:mm:ss"];
 NSString *strFromDate = [formatter stringFromDate:morningStart]; // this will return 2012-Jun-21 00:00:00
于 2012-06-21T07:48:28.740 に答える
2

以下を使用して iOS8 でこれを行うのは非常に簡単ですstartOfDayForDate

let date = NSDate() 
let calendar = NSCalendar.currentCalendar(calendarIdentifier: NSGregorianCalendar)
let dateAtStartOfDay = calendar.startOfDayForDate(date)

または、次のように Swift で従来の方法で行うこともできます。

let date = NSDate()
let calendar = NSCalendar.currentCalendar(calendarIdentifier: NSGregorianCalendar)
// Use a mask to extract the required components from today's date
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: date)
let dateAtStartOfDay = calendar.dateFromComponents(components)!
print(dateAtStartOfDay) 

(注: NSDates は GMT を基準にして格納されます。したがってprint、相対的な現地時間が表示されます。NSDates を適切に使用するには、TimeZone を明確に理解することが不可欠です。)

于 2015-06-22T19:02:16.790 に答える