27

NSDate既存の の時間を設定するにはどうすればよいですか?

つまり、日付 (現在の日付/時刻など) がありますが、これを特定の時刻 (午前 11 時 23 分など) に設定したいとします。Objective Cでこれを行う最も簡単な方法は何ですか?

私は、 、NSCalendarなどのメソッドを見て見ていますが、これらは私がここで必要としているものを完全に満たしていないようです。例えば:dateByAddingComponents:toDate:options:dateFromComponents:

  1. dateFromComponents:- これが機能するには、すべてのコンポーネントを解決する必要がありますが、これはやり過ぎのように思えます
  2. dateByAddingComponents:toDate:options:- 私の場合は追加したくありませんが、時間を「設定」します。
4

6 に答える 6

73
NSDate *date = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date];
[components setHour: 7];
[components setMinute: 59];
[components setSecond: 17];

NSDate *newDate = [gregorian dateFromComponents: components];

特定の OR 結合ビット マスクの代わりに使用するNSUIntegerMax方が簡単ですが、受信するデータ コンポーネントを指定する場合は、ゲストになってください。

于 2011-03-18T23:31:03.777 に答える
11

iOS 7 注: NSUIntegerMax の使用が iOS7 で機能しなくなったようで、それを使用すると約 3 時間尻尾を追いかけたので、これらの質問のいくつかにこれを入れています。を使用するNSUIntegerMaxと、NSDateComponents設定された年が無視されることがわかりました。たとえば、これは年を変更しません。

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSUIntegerMax fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];

これに対して:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger timeComps = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit);
NSDateComponents *comps = [gregorian components:timeComps fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];

これは iOS7 のバグであるか、NSUIntegerMax の使用がまぐれで機能しなくなった可能性があります。バグレポートを提出し、決定的な回答を得ます。

とにかく、予期しない結果を避けたい場合は、他のすべてのコンポーネントを指定してください。

于 2013-10-17T13:24:28.253 に答える
4

これを適用して、別の日付から既存の日付までの時刻を設定します

NSDate *today = [NSDate date]; // from which i need only "Year" "Month" "Date"

NSCalendar *calendar = [NSCalendar currentCalendar]
NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) fromDate:today];

NSDate *timeDate = datePicker.date; // from which i need only "Hours" "Minutes" and "Seconds"

NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:timeDate];

            [dateComponents setHour:[timeComponents hour]];
            [dateComponents setMinute:[timeComponents minute]];
            [dateComponents setSecond:[timeComponents second]];

NSDate *newDate = [calendar dateFromComponents:dateComponents]; // New Date with My "Year" "Month" "Date" "Hours" "Minutes" and "Seconds" 

            NSLog(@"New Date: %@",newDate);
于 2012-06-06T11:00:50.823 に答える
3

これは、Andrew Schreiber の役立つ回答に基づいて構築された、より一般的な Swift (v2.1.1) 拡張機能です。

extension NSDate {
    func dateWithTime(hour: Int, minute: Int, second: Int) -> NSDate? {
        let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let components = calendar.components(([.Day, .Month, .Year]), fromDate: self)
        components.hour = hour
        components.minute = minute
        components.second = second
        let newDate = calendar.dateFromComponents(components)
        return newDate
    }
}
于 2016-03-17T19:47:17.523 に答える
1

迅速な例。私の目的では、明日の正午頃の日付を取得したかったのです。

var tomorrow:NSDate = NSDate().dateByAddingTimeInterval(60*60*24); //60seconds*60minutes*12hours
var gregorian:NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!;
var unit : NSCalendarUnit = (NSCalendarUnit.YearCalendarUnit|NSCalendarUnit.MonthCalendarUnit|NSCalendarUnit.DayCalendarUnit|NSCalendarUnit.HourCalendarUnit|NSCalendarUnit.MinuteCalendarUnit);
var comps:NSDateComponents = gregorian.components(unit, fromDate: tomorrow);
comps.setValue(12, forComponent: NSCalendarUnit.HourCalendarUnit);
comps.setValue(0, forComponent: NSCalendarUnit.MinuteCalendarUnit);
var noon_tomorrow : NSDate = gregorian.dateFromComponents(comps)!;
于 2015-02-07T21:43:56.713 に答える