質問

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

つまり、日付(現在の日付/時刻など)がありますが、これを特定の時間(たとえば11.23am)に設定したいと考えています。目的Cでこれを行う最も簡単な方法は何ですか?

私は見ています NSCalendar 次のような方法を参照してください dateByAddingComponents:toDate:options:, 、 と dateFromComponents:, 、しかし、これらは私がここで必要なものにまったくマークを襲っていないようです。例えば:

  1. dateFromComponents: - これがうまくいくように思えるように機能するためには、すべてのコンポーネントを解決する必要があります
  2. dateByAddingComponents:toDate:options: - 私は私のケースを追加したくありませんが、むしろ時間を「設定」します。
役に立ちましたか?

解決

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];

私が使う NSUIntegerMax 特定の組み合わせビットマスクの代わりに、それが簡単だからですが、受信するデータコンポーネントを指定したい場合は、ゲストになります。

他のヒント

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の動作を使用することは、もはや機能しないflukeである可能性があります。バグレポートを提出し、決定的な答えを受け取ります。

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

特定の日付を午前8時に設定する方法のSwift2.0バージョン

extension NSDate {

func setTo8AM() -> NSDate {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    let components = calendar.components(([.Day, .Month, .Year]), fromDate: self)
    components.hour = 8
    return calendar.dateFromComponents(components)!
}

}

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

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);

これは、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
    }
}

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

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)!;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top