Tronca NSDate (tempo di azzeramento)

Voglio generare un nuovo NSDate con 0 ore , 0 minuti e 0 secondi per volta. La data di origine può essere qualsiasi NSDate casuale.

C’è un modo per ottenere questo? La documentazione non mi ha aiutato con questo.


Esempio

Hanno: 2010-10-30 10:14:13 GMT

Vuoi: 2010-10-30 00:00:00 GMT

     unsigned int flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSCalendar* calendar = [NSCalendar currentCalendar]; NSDateComponents* components = [calendar components:flags fromDate:date]; NSDate* dateOnly = [calendar dateFromComponents:components]; 

    date è la data da cui si desidera rimuovere l’ora.

    Questo separa la data e l’ora e crea una nuova data con l’ora predefinita (00:00:00).

    MODIFICARE

    Per tenere conto del fuso orario:

     NSDate* dateOnly = [[calendar dateFromComponents:components] dateByAddingTimeInterval:[[NSTimeZone localTimeZone]secondsFromGMT]]; 

    Usa rangeOfUnit di rangeOfUnit:startDate:interval:forDate: Questo codice sceglierà il limite del giorno in base al fuso orario corrente. Se si desidera un determinato fuso orario, è necessario creare un NSCalendar e impostare il relativo fuso orario in modo appropriato.

     - (NSDate*)boundaryForCalendarUnit:(NSCalendarUnit)calendarUnit { NSDate *boundary; [[NSCalendar currentCalendar] rangeOfUnit:calendarUnit startDate:&boundary interval:NULL forDate:self]; return boundary; } - (NSDate*)dayBoundary { return [self boundaryForCalendarUnit:NSDayCalendarUnit]; } 

    Con Swift 3, puoi scegliere uno dei quattro seguenti modelli per risolvere il tuo problema.


    # 1. Uso di Calendar startOfDay(for:)

    startOfDay(for:) ha la seguente dichiarazione:

     func startOfDay(for date: Date) -> Date 

    Restituisce il primo momento di una data Date , come una Date .

    Il seguente codice di gioco mostra come usare questo metodo:

     import Foundation let date = Date() // Get new date let calendar = Calendar.current let newDate = calendar.startOfDay(for: date) // Format dates let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_UK") dateFormatter.dateStyle = .short dateFormatter.timeStyle = .long let formattedDate = dateFormatter.string(from: date) let formattedNewDate = dateFormatter.string(from: newDate) // Print formatted dates print(formattedDate) // Prints: 30/03/2017, 15:14:41 CEST print(formattedNewDate) // Prints: 30/03/2017, 00:00:00 CEST 

    # 2. Uso di Calendar date(bySettingHour:minute:second:of:matchingPolicy:repeatedTimePolicy:direction:)

    date(bySettingHour:minute:second:of:matchingPolicy:repeatedTimePolicy:direction:) ha la seguente dichiarazione:

     func date(bySettingHour hour: Int, minute: Int, second: Int, of date: Date, matchingPolicy: Calendar.MatchingPolicy = default, repeatedTimePolicy: Calendar.RepeatedTimePolicy = default, direction: Calendar.SearchDirection = default) -> Date? 

    Restituisce una nuova Date rappresenta la data calcasting impostando l’ora, i minuti e i secondi in un dato momento in una Date specificata.

    Il seguente codice di gioco mostra come usare questo metodo:

     import Foundation let date = Date() // Get new date let calendar = Calendar.current let newDate = calendar.date(bySettingHour: 0, minute: 0, second: 0, of: date) // Format dates let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_UK") dateFormatter.dateStyle = .short dateFormatter.timeStyle = .long let formattedDate = dateFormatter.string(from: date) let formattedNewDate = dateFormatter.string(from: newDate!) // Print formatted dates print(formattedDate) // Prints: 30/03/2017, 15:14:41 CEST print(formattedNewDate) // Prints: 30/03/2017, 00:00:00 CEST 

    # 3. Uso di Calendar dateComponents(_:from:) e date(from:) metodi date(from:)

    dateComponents(_:from:) ha la seguente dichiarazione:

     func dateComponents(_ components: Set, from date: Date) -> DateComponents 

    Restituisce tutti i componenti della data di una data, utilizzando il fuso orario del calendario.

    date(from:) ha la seguente dichiarazione:

     func date(from components: DateComponents) -> Date? 

    Restituisce una data creata dai componenti specificati.

    Il codice Playground qui sotto mostra come usare questi metodi:

     import Foundation let date = Date() // Get new date let calendar = Calendar.current let components = calendar.dateComponents([.day, .month, .year], from: date) let newDate = calendar.date(from: components) // Format dates let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_UK") dateFormatter.dateStyle = .short dateFormatter.timeStyle = .long let formattedDate = dateFormatter.string(from: date) let formattedNewDate = dateFormatter.string(from: newDate!) // Print formatted dates print(formattedDate) // Prints: 30/03/2017, 15:14:41 CEST print(formattedNewDate) // Prints: 30/03/2017, 00:00:00 CEST 

    # 4. Utilizzo range(of:start:interval:for:) NSCalendar range(of:start:interval:for:)

    range(of:start:interval:for:) ha la seguente dichiarazione:

     func range(of unit: NSCalendar.Unit, start datep: AutoreleasingUnsafeMutablePointer?, interval tip: UnsafeMutablePointer?, for date: Date) -> Bool 

    Restituisce per riferimento l’ora di inizio e la durata di una determinata unità del calendario che contiene una determinata data.

    Il seguente codice di gioco mostra come usare questo metodo:

     import Foundation let date = Date() // Get new date let calendar = Calendar.current as NSCalendar var newDate: NSDate? calendar.range(of: .day, start: &newDate, interval: nil, for: date) // Format dates let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_UK") dateFormatter.dateStyle = .short dateFormatter.timeStyle = .long let formattedDate = dateFormatter.string(from: date) let formattedNewDate = dateFormatter.string(from: newDate as! Date) // Print formatted dates print(formattedDate) // Prints: 30/03/2017, 15:14:41 CEST print(formattedNewDate) // Prints: 30/03/2017, 00:00:00 CEST 

    So che è tardi, ma ora ci sono metodi migliori: perché non lo usi

    Swift 2

     NSCalendar.currentCalendar().dateBySettingHour(0, minute: 0, second: 0, ofDate: yourDateToZeroOutTime, options: []) 

    Swift 3 sarebbe qualcosa senza il prefisso NS;)

    Swift 3

     extension Date { func trimTime() -> Date { var boundary = Date() var interval: TimeInterval = 0 _ = Calendar.current.dateInterval(of: .day, start: &boundary, interval: &interval, for: self) return Date(timeInterval: TimeInterval(NSTimeZone.system.secondsFromGMT()), since: boundary) } } 

    Vorrei usare il metodo description per ottenere la data data come stringa, quindi modificare la stringa e creare la nuova data con initWithString.

    initWithString: restituisce un object NSDate inizializzato con un valore di data e ora specificato da una determinata stringa nel formato di rappresentazione stringa internazionale.

    • (id) initWithString: descrizione (NSString *) Descrizione dei parametri Una stringa che specifica un valore di data e ora nel formato di rappresentazione stringa internazionale-AAAA-MM-GG HH: MM: SS ± HHMM, dove ± HHMM è un offset fuso orario in ore e minuti da GMT (ad esempio “2001-03-24 10:45:32 +0600”). È necessario specificare tutti i campi della stringa di formato, incluso l’offset del fuso orario, che deve avere un prefisso del segno più o meno. Valore restituito Un object NSDate inizializzato con un valore di data e ora specificato da aString.