Come si imposta un tempo di NSDATE esistente?
-
27-10-2019 - |
Domanda
Come imposto un esistente NSDate
è tempo?
Cioè ho una data (diciamo la data/ora corrente), ma quindi voglio impostarlo su un orario specifico (ad esempio 11.23). Qual è il modo più rapido per farlo nell'obiettivo C?
Sto guardando NSCalendar
e vedere metodi come dateByAddingComponents:toDate:options:
, e dateFromComponents:
, ma questi non sembrano colpire il segno per ciò di cui ho bisogno qui. Per esempio:
dateFromComponents:
- Dovrei elaborare tutti i componenti affinché questo funzioni che sembra eccessivodateByAddingComponents:toDate:options:
- Non voglio aggiungere il mio caso, ma piuttosto "impostare" il tempo.
Soluzione
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];
Io uso NSUIntegerMax
Invece di maschere bit specifiche o combinate perché è più facile, ma se si desidera specificare quali componenti di dati ricevere, sii mio ospite.
Altri suggerimenti
iOS 7 Nota: Lo metto in alcune di queste domande perché l'uso di NSUINTEGERMAX non sembra più funzionare su iOS7 e usarlo mi ha fatto inseguire la coda per circa 3 ore. L'ho appena scoperto quando uso NSUIntegerMax
, NSDateComponents
Ignora l'anno fisso. Quindi, ad esempio, questo non cambia l'anno:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSUIntegerMax fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];
Mentre questo fa:
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];
Potrebbe essere un bug iOS7 o può darsi che l'uso di NSUINTEGERMAX funzionasse sia un colpo di fortuna che non funziona più. Farò una segnalazione di bug e otterrò una risposta definitiva.
Indipendentemente da ciò, se si desidera evitare conseguenze impreviste, specifica tutti i componenti altro, potresti inseguire la coda!
Swift 2.0 versione di come impostare una data data alle 8am
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)!
}
}
Applicalo per impostare l'ora da un'altra data a una data esistente
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);
Ecco un'estensione più generica Swift (V2.1.1) che si basa sulla risposta utile di Andrew Schreiber.
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
}
}
Un esempio rapido. Per i miei scopi, volevo ottenere la data per circa le 12 di domani.
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)!;