Ricerca…


Sintassi

  • NSDate () // NSDate oggetto init alla data e ora correnti
  • NSDate (). TimeIntervalSince1970 // Data e ora correnti in numero di secondi da 00:00:00 UTC del 1 gennaio 1970.
  • NSDate (). Compare (other: NSDate) // Restituisce un confronto tra la data corrente e un'altra data restituisce un NSComparisonResult

Osservazioni

Esistono diversi tipi di formato di data che è possibile impostare: qui è l'elenco completo di essi.

Formato Significato / Descrizione Esempio 1 Esempio 2
y Un anno con almeno 1 cifra. 175 AD → "175" 2016 ANNUNCIO → "2016"
aa Un anno con esattamente 2 cifre. 5 ANNUNCIO → "05" ANNUNCIO 2016 → "16"
yyy Un anno con almeno 3 cifre. 5 ANNUNCIO → "005" 2016 ANNUNCIO → "2016"
aaaa Un anno con almeno 4 cifre. 5 AD → "0005" 2016 ANNUNCIO → "2016"
M Un mese con almeno 1 cifra. Luglio → "7" "Novembre" → "11"
MM Un mese con almeno 2 cifre. Luglio → "07" "Novembre" → "11"
MMM Abbreviazione di tre lettere al mese. Luglio → "Jul" "Novembre" → "Nov"
MMMM Nome completo del mese. Luglio → "Luglio" "Novembre" → "Novembre"
MMMMM Abbreviazione di un mese in lettere (Jan, June, July all avranno 'J'). Luglio → "J" "Novembre" → "N"
d Giorno con almeno una cifra. 8 → "8" 29 → "29"
dd Giorno con almeno due cifre. 8 → "08" 29 → "29"
"E", "EE" o "EEE" Abbreviazione di 3 lettere al giorno del nome del giorno. Lunedì → "Mon" Giovedi → "Gio"
EEEE Nome del giorno completo. Lunedì → "lunedì" Giovedi → "Giovedi"
EEEEE Abbreviazione di 1 lettera del nome del giorno. (Gio e Mar sarà 'T') Lunedì → "M" Giovedì → "T"
EEEEEE Abbreviazione di 2 lettere al giorno del nome del giorno. Lunedì → "Mo" Giovedi → "Th"
un Periodo del giorno (AM / PM). 22:00 → "PM" 2 AM → "AM"
h Un'ora basata su 1-12 con almeno 1 cifra. 10 PM → "10" 2 AM → "2"
hh Un'ora basata su 1-12 con almeno 2 cifre. 10 PM → "10" 2 AM → "02"
H Un'ora basata su 0-23 con almeno 1 cifra. 10 PM → "14" 2 AM → "2"
HH Un'ora basata su 0-23 con almeno 2 cifre. 10 PM → "14" 2 AM → "02"
m Un minuto con almeno 1 cifra. 7 → "7" 29 → "29"
mm Un minuto con almeno 2 cifre. 7 → "07" 29 → "29"
S Un secondo con almeno 1 cifra. 7 → "7" 29 → "29"
ss Un secondo con almeno 2 cifre. 7 → "07" 29 → "29"

Ce ne sono molti altri, per ottenere tempi diversi in base alla zona (z), per ottenere tempo con dettagli al millisecondo (S), ecc.

Ottieni la data corrente

Ottenere la data corrente è molto semplice. Ottieni l'oggetto NSDate della data corrente in una sola riga come segue:

veloce

var date = NSDate()

Swift 3

var date = Date()

Objective-C

NSDate *date = [NSDate date];

Ottieni oggetto NSDate N secondi dalla data corrente

Il numero di secondi dalla data e ora correnti per la nuova data. Utilizzare un valore negativo per specificare una data prima della data corrente.

Per fare questo abbiamo un metodo denominato dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate (Swift) o + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds (Objective-C).

Ora, ad esempio, se hai bisogno di una data una settimana dalla data corrente e una settimana alla data attuale, allora possiamo farlo come.

veloce

let totalSecondsInWeek:NSTimeInterval = 7 * 24 * 60 * 60;
//Using negative value for previous date from today
let nextWeek = NSDate().dateWithTimerIntervalSinceNow(totalSecondsInWeek)

//Using positive value for future date from today
let lastWeek = NSDate().dateWithTimerIntervalSinceNow(-totalSecondsInWeek)

Swift 3

let totalSecondsInWeek:TimeInterval = 7 * 24 * 60 * 60;

//Using positive value to add to the current date
let nextWeek = Date(timeIntervalSinceNow: totalSecondsInWeek)

//Using negative value to get date one week from current date
let lastWeek = Date(timeIntervalSinceNow: -totalSecondsInWeek)

Objective-C

NSTimeInterval totalSecondsInWeek = 7 * 24 * 60 * 60;
//Using negative value for previous date from today
NSDate *lastWeek = [NSDate dateWithTimeIntervalSinceNow:-totalSecondsInWeek];

//Using positive value for future date from today
NSDate *nextWeek = [NSDate dateWithTimeIntervalSinceNow:totalSecondsInWeek];

NSLog(@"Last Week: %@", lastWeek);
NSLog(@"Right Now: %@", now);
NSLog(@"Next Week: %@", nextWeek);

Data di confronto

Esistono 4 metodi per confrontare le date:

veloce

  • isEqualToDate(anotherDate: NSDate) -> Bool
  • earlierDate(anotherDate: NSDate) -> NSDate
  • laterDate(anotherDate: NSDate) -> NSDate
  • compare(anotherDate: NSDate) -> NSComparisonResult

Objective-C

  • - (BOOL)isEqualToDate:(NSDate *)anotherDate
  • - (NSDate *)earlierDate:(NSDate *)anotherDate
  • - (NSDate *)laterDate:(NSDate *)anotherDate
  • - (NSComparisonResult)compare:(NSDate *)anotherDate

Diciamo che abbiamo 2 date:

veloce

let date1: NSDate = ... // initialized as  July 7, 2016 00:00:00
let date2: NSDate = ... // initialized as  July 2, 2016 00:00:00

Objective-C

NSDate *date1 = ... // initialized as  July 7, 2016 00:00:00
NSDate *date2 = ... // initialized as  July 2, 2016 00:00:00

Quindi, per confrontarli, proviamo questo codice:

veloce

if date1.isEqualToDate(date2) {
    // returns false, as both dates aren't equal
}

earlierDate: NSDate = date1.earlierDate(date2) // returns the earlier date of the two (date 2)
laterDate: NSDate = date1.laterDate(date2) // returns the later date of the two (date1)

result: NSComparisonResult = date1.compare(date2)

if result == .OrderedAscending {
    // true if date1 is earlier than date2
} else if result == .OrderedSame {
    // true if the dates are the same
} else if result == .OrderedDescending {
    // true if date1 is later than date1
}

Objective-C

if ([date1 isEqualToDate:date2]) {
    // returns false, as both date are not equal
}

NSDate *earlierDate = [date1 earlierDate:date2]; // returns date which comes earlier from both date, here it will return date2
NSDate *laterDate = [date1 laterDate:date2]; // returns date which comes later from both date, here it will return date1

NSComparisonResult result = [date1 compare:date2];
if (result == NSOrderedAscending) {
    // fails
    // comes here if date1 is earlier then date2, in our case it will not come here
} else if (result == NSOrderedSame){
    // fails
    // comes here if date1 is same as date2, in our case it will not come here
} else{ // NSOrderedDescending
    // succeeds
    // comes here if date1 is later than date2, in our case it will come here
}

Se desideri confrontare date e gestire secondi, settimane, mesi e anni:

Swift 3

let dateStringUTC = "2016-10-22 12:37:48 +0000"
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss X"
let date = dateFormatter.date(from: dateStringUTC)!

let now = Date()

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.maximumUnitCount = 2
let string = formatter.string(from: date, to: Date())! + " " + NSLocalizedString("ago", comment: "added after elapsed time to say how long before")

Oppure puoi usare questo per ogni componente:

// get the current date and time
let currentDateTime = Date()

// get the user's calendar
let userCalendar = Calendar.current

// choose which date and time components are needed
let requestedComponents: Set<Calendar.Component> = [
    .year,
    .month,
    .day,
    .hour,
    .minute,
    .second
]

// get the components
let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDateTime)

// now the components are available
dateTimeComponents.year 
dateTimeComponents.month 
dateTimeComponents.day  
dateTimeComponents.hour 
dateTimeComponents.minute
dateTimeComponents.second

Ottieni l'ora di Unix Epoch

Per ottenere Unix Epoch Time , utilizza la costante timeIntervalSince1970 :

veloce

let date = NSDate() // current date
let unixtime = date.timeIntervalSince1970

Objective-C

NSDate *date = [NSDate date]; // current date
int unixtime = [date timeIntervalSince1970];

NSDateFormatter

La conversione di un oggetto NSDate in stringa è di soli 3 passaggi.

1. Creare un oggetto NSDateFormatter

veloce

let dateFormatter = NSDateFormatter()

Swift 3

let dateFormatter = DateFormatter()

Objective-C

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

2. Impostare il formato della data in cui si desidera la stringa

veloce

dateFormatter.dateFormat = "yyyy-MM-dd 'at' HH:mm"

Objective-C

dateFormatter.dateFormat = @"yyyy-MM-dd 'at' HH:mm";

3. Ottieni la stringa formattata

veloce

let date = NSDate() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)

Swift 3

let date = Date() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)

Objective-C

NSDate *date = [NSDate date]; // your NSDate object
NSString *dateString = [dateFormatter stringFromDate:date];

Questo darà qualcosa di simile a questo: 2001-01-02 at 13:00

Nota

La creazione di un'istanza NSDateFormatter è un'operazione costosa, quindi è consigliabile crearla una volta e riutilizzarla quando possibile.

Estensione utile per convertire la data in stringa.

extension Date {
        func toString() -> String {
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "MMMM dd yyyy"
            return dateFormatter.string(from: self)
        }
}

Link utili per una data-formazione rapida che diventa rapidamente-leggibile-data-nsdateformatter .

Per la costruzione di formati di data, vedere i modelli di formato della data .

Converti NSDate composto da ora e minuto (solo) a un NSDate completo

Esistono molti casi in cui uno ha creato un NSDate da un formato di un'ora e minuti, ovvero: 08:12 che restituisce da un server come una stringa e si avvia un'istanza NSDate solo con questi valori.

Il lato negativo di questa situazione è che il tuo NSDate è quasi completamente "nudo" e quello che devi fare è creare: giorno, mese, anno, secondo e fuso orario in modo che questo oggetto "giochi" con altri tipi NSDate.

Per fare un esempio, diciamo che hourAndMinute è il tipo NSDate composto dal formato ora e minuto:

Objective-C

NSDateComponents *hourAndMinuteComponents = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute
                                                         fromDate:hourAndMinute];
NSDateComponents *componentsOfDate = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear
                                                                     fromDate:[NSDate date]];

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay: componentsOfDate.day];
[components setMonth: componentsOfDate.month];
[components setYear: componentsOfDate.year];
[components setHour: [hourAndMinuteComponents hour]];
[components setMinute: [hourAndMinuteComponents minute]];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone defaultTimeZone]];

NSDate *yourFullNSDateObject = [calendar dateFromComponents:components];

Ora il tuo oggetto è l'esatto contrario di essere "nudo".

Offset ora UTC da NSDate con TimeZone

Qui questo calcolerà l'offset dell'ora UTC dai dati correnti nel fuso orario desiderato.

+(NSTimeInterval)getUTCOffSetIntervalWithCurrentTimeZone:(NSTimeZone *)current forDate:(NSDate *)date  {
    NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
    NSInteger currentGMTOffset = [current secondsFromGMTForDate:date];
    NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date];
    NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset;
    return gmtInterval;
}

Ottieni il tipo di ciclo temporale (12 ore o 24 ore)

Verifica se la data corrente contiene il simbolo per AM o PM

Objective-C

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString *dateString = [formatter stringFromDate:[NSDate date]];
NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]];
NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]];
BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound);

Richiesta del tipo di ciclo temporale da NSDateFormatter

Objective-C

NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL is24h = containsA.location == NSNotFound;

Questo utilizza una stringa di modello data speciale chiamata "j" che secondo la specifica ICU ...

[...] richiede il formato ora preferito per le impostazioni internazionali (h, H, K o k), come determinato dall'attributo preferito dell'elemento hours nei dati supplementari. [...] Si noti che l'uso di 'j' in uno scheletro passato a un'API è l'unico modo per richiedere a uno scheletro il tipo di ciclo temporale preferito di una locale (12 ore o 24 ore).

Quest'ultima frase è importante. È "l'unico modo per fare in modo che uno scheletro richieda il tipo di ciclo temporale preferito da una locale". Poiché NSDateFormatter e NSCalendar sono costruiti sulla libreria ICU, lo stesso vale qui.

Riferimento

La seconda opzione è stata derivata da questa risposta .

Ottieni NSDate dal formato data JSON "/ Data (1268123281843) /"

Prima delle date di Json.NET 4.5 sono stati scritti utilizzando il formato Microsoft: "/ Date (1198908717056) /". Se il server invia la data in questo formato, è possibile utilizzare il codice seguente per serializzarlo su NSDate:

Objective-C

(NSDate*) getDateFromJSON:(NSString *)dateString
{
    // Expect date in this format "/Date(1268123281843)/"
    int startPos = [dateString rangeOfString:@"("].location+1;
    int endPos = [dateString rangeOfString:@")"].location;
    NSRange range = NSMakeRange(startPos,endPos-startPos);
    unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue];
    NSLog(@"%llu",milliseconds);
    NSTimeInterval interval = milliseconds/1000;
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:interval];
    // add code for date formatter if need NSDate in specific format.
    return date;
}

Ottieni storico da NSDate (es: 5s fa, 2 mesi fa, 3 ore fa)

Può essere utilizzato in varie applicazioni di chat, feed RSS e app social in cui è necessario disporre degli ultimi feed con timestamp:

Objective-C

- (NSString *)getHistoricTimeText:(NSDate *)since
{
    NSString *str;
    NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:since];
    if(interval < 60)
        str = [NSString stringWithFormat:@"%is ago",(int)interval];
    else if(interval < 3600)
    {
        int minutes = interval/60;
        str = [NSString stringWithFormat:@"%im ago",minutes];
    }
    else if(interval < 86400)
    {
        int hours =  interval/3600;
        
        str = [NSString stringWithFormat:@"%ih ago",hours];
    }
    else
    {
        NSDateFormatter *dateFormater=[[NSDateFormatter alloc]init];
        [dateFormater setLocale:[NSLocale currentLocale]];
        NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"MMM d, YYYY" options:0 locale:[NSLocale currentLocale]];
        [dateFormater setDateFormat:dateFormat];
        str = [dateFormater stringFromDate:since];
        
    }
    return str;
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow