Suche…


Syntax

  • NSDate () // NSDate-Objektinitialisierung auf das aktuelle Datum und die aktuelle Uhrzeit
  • NSDate (). TimeIntervalSince1970 // Aktuelles Datum und Uhrzeit in Sekunden ab 00:00:00 UTC am 1. Januar 1970.
  • NSDate (). Compare (other: NSDate) // Gibt einen Vergleich des aktuellen Datums mit einem anderen Datum zurück und gibt ein NSComparisonResult

Bemerkungen

Es gibt verschiedene Arten von Datumsformaten, die Sie einstellen können: Hier ist eine vollständige Liste davon.

Format Bedeutung / Beschreibung Beispiel 1 Beispiel2
y Ein Jahr mit mindestens einer Ziffer. 175 n. Chr. → „175“ 2016 AD → „2016“
yy Ein Jahr mit genau 2 Ziffern. 5 n. Chr. “05” 2016 AD → “16”
yyy Ein Jahr mit mindestens 3 Ziffern. 5 n. Chr. “005” 2016 AD → „2016“
yyyy Ein Jahr mit mindestens 4 Ziffern. 5 n. Chr. → „0005“ 2016 AD → „2016“
M Ein Monat mit mindestens einer Ziffer. Juli → „7“ "November" → "11"
MM Ein Monat mit mindestens 2 Ziffern. Juli → “07” "November" → "11"
MMM Abkürzung für drei Buchstaben. Juli → “Jul” "November" → "Nov"
MMMM Vollständiger Name des Monats Juli → “Juli” "November" → "November"
MMMMM Abkürzung für einen Buchstabenmonat (Jan, Juni, Juli wird alle "J" haben). Juli → “J” "November" → "N"
d Tag mit mindestens einer Ziffer. 8 → "8" 29 → „29“
dd Tag mit mindestens zwei Ziffern. 8 → "08" 29 → „29“
"E", "EE" oder "EEE" 3-stelliger Tageskürzel für den Namen des Tages. Montag → “Mo” Donnerstag → “Do”
EEEE Ganztägiger Name Montag → “Montag” Donnerstag → „Donnerstag“
EEEEE 1-stelliger Tageskürzel für den Namen des Tages. (Do und Di sind 'T') Montag → “M” Donnerstag → “T”
EEEEEEE 2-tägige Abkürzung des Tagesnamens. Montag → „Mo“ Donnerstag → “Do”
ein Tageszeit (AM / PM). 22 Uhr → “PM” 02.00 Uhr → „AM“
h Eine 1-12-basierte Stunde mit mindestens einer Ziffer. 22 Uhr → "10" 2 Uhr morgens → “2”
hh Eine 1-12-basierte Stunde mit mindestens 2 Ziffern. 22 Uhr → "10" 2 Uhr morgens → “02”
H Eine 0-23-basierte Stunde mit mindestens 1 Ziffer. 22 Uhr → „14“ 2 Uhr morgens → “2”
HH Eine 0-23-basierte Stunde mit mindestens 2 Ziffern. 22 Uhr → „14“ 2 Uhr morgens → “02”
m Eine Minute mit mindestens einer Ziffer. 7 → "7" 29 → „29“
mm Eine Minute mit mindestens 2 Ziffern. 7 → "07" 29 → „29“
s Eine Sekunde mit mindestens einer Ziffer. 7 → "7" 29 → „29“
ss Eine Sekunde mit mindestens 2 Ziffern. 7 → "07" 29 → „29“

Es gibt viele weitere, um unterschiedliche Zeiten basierend auf Zone (z) zu erhalten, um Zeit mit Millisekunden-Details (S) usw. zu erhalten.

Aktuelles Datum abrufen

Das aktuelle Datum zu bekommen ist sehr einfach. Sie erhalten das NSDate-Objekt des aktuellen Datums in nur einer Zeile wie folgt:

Schnell

var date = NSDate()

Swift 3

var date = Date()

Ziel c

NSDate *date = [NSDate date];

NSDate-Objekt N Sekunden ab dem aktuellen Datum abrufen

Die Anzahl der Sekunden ab dem aktuellen Datum und der aktuellen Uhrzeit für das neue Datum. Verwenden Sie einen negativen Wert, um ein Datum vor dem aktuellen Datum anzugeben.

Dafür haben wir eine Methode namens dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate (Swift) oder + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds (Objective-C).

Wenn Sie beispielsweise ein Datum benötigen, das eine Woche vom aktuellen Datum und eine Woche bis zum aktuellen Datum beträgt, können wir es als tun.

Schnell

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)

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

Datumsvergleich

Es gibt 4 Methoden zum Vergleichen von Datumsangaben:

Schnell

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

Ziel c

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

Nehmen wir an, wir haben 2 Termine:

Schnell

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

Ziel c

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

Um sie zu vergleichen, versuchen wir diesen Code:

Schnell

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
}

Ziel 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
}

Wenn Sie Datumsangaben vergleichen und Sekunden, Wochen, Monate und Jahre behandeln möchten:

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

Oder Sie können dies für jede Komponente verwenden:

// 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

Holen Sie sich Unix-Epoche-Zeit

Um die Unix- timeIntervalSince1970 zu erhalten, verwenden Sie die konstante timeIntervalSince1970 :

Schnell

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

Ziel c

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

NSDateFormatter

Das Konvertieren eines NSDate Objekts in einen String erfolgt in nur 3 Schritten.

1. Erstellen Sie ein NSDateFormatter Objekt

Schnell

let dateFormatter = NSDateFormatter()

Swift 3

let dateFormatter = DateFormatter()

Ziel c

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

2. Legen Sie das Datumsformat fest, in dem Sie Ihre Zeichenfolge möchten

Schnell

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

Ziel c

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

3. Holen Sie sich die formatierte Zeichenfolge

Schnell

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

Swift 3

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

Ziel c

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

Dies ergibt eine Ausgabe in etwa wie 2001-01-02 at 13:00 : 2001-01-02 at 13:00

Hinweis

Das Erstellen einer NSDateFormatter Instanz ist ein teurer Vorgang. NSDateFormatter wird empfohlen, sie einmal zu erstellen und nach Möglichkeit wiederzuverwenden.

Nützliche Erweiterung zum Konvertieren des Datums in einen String.

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

Nützliche Links für die schnelle Datumsbildung, die schnell lesbar werden kann .

Zum Erstellen von Datumsformaten siehe Muster für Datumsformate .

Konvertieren Sie NSDate, das (nur) aus Stunde und Minute besteht, in ein vollständiges NSDate

Es gibt viele Fälle, in denen ein NSDate nur aus einem Stunden- und Minutenformat erstellt wurde, z. B. 08:12, das von einem Server als String zurückgegeben wird, und Sie initiieren eine NSDate-Instanz nur mit diesen Werten.

Der Nachteil für diese Situation ist, dass Ihr NSDate fast vollständig "nackt" ist und Sie Folgendes erstellen müssen: Tag, Monat, Jahr, Sekunde und Zeitzone, damit dieses Objekt mit anderen NSDate-Typen "zusammenspielen" kann.

Nehmen wir an, dass hourAndMinute der NSDate-Typ ist, der sich aus dem Stunden- und Minutenformat zusammensetzt.

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

Jetzt ist dein Objekt das totale Gegenteil von "nackt".

UTC Zeitversatz von NSDate mit TimeZone

Hier wird der UTC Zeitversatz aus den aktuellen Daten in der gewünschten Zeitzone berechnet.

+(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;
}

Zeitzyklusart abrufen (12 Stunden oder 24 Stunden)

Prüfen, ob das aktuelle Datum das Symbol für AM oder PM enthält

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

Anforderung des Zeitzyklus-Typs von NSDateFormatter

Ziel c

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

Hierbei wird eine spezielle Datumsvorlagenzeichenfolge namens "j" verwendet, die gemäß der ICU-Spezifikation ...

[...] fordert das bevorzugte Stundenformat für das Gebietsschema (h, H, K oder k) an, das durch das bevorzugte Attribut des Stundenelements in den Zusatzdaten bestimmt wird. [...] Beachten Sie, dass die Verwendung von 'j' in einem an eine API übergebenen Skelett die einzige Möglichkeit ist, dass ein Skelett den bevorzugten Zeitzyklus-Typ eines Gebietsschemas (12 Stunden oder 24 Stunden) anfordert.

Dieser letzte Satz ist wichtig. "Es ist die einzige Möglichkeit, ein Skelett den bevorzugten Zeitzyklustyp eines Gebietsschemas anzufordern". Da NSDateFormatter und NSCalendar auf der ICU-Bibliothek NSCalendar , gilt dies auch hier.

Referenz

Die zweite Option wurde aus dieser Antwort abgeleitet .

NSDate von JSON-Datumsformat abrufen "/ Date (1268123281843) /"

Vor Json.NET 4.5 wurden Datumsangaben im Microsoft-Format geschrieben: "/ Date (1198908717056) /". Wenn Ihr Server ein Datum in diesem Format sendet, können Sie den folgenden Code verwenden, um ihn in NSDate zu serialisieren:

Ziel 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;
}

Holen Sie sich historische Zeit von NSDate (zB: vor 5s, 2m, 3h)

Dies kann in verschiedenen Chat-Anwendungen, RSS-Feeds und sozialen Apps verwendet werden, wo Sie aktuelle Feeds mit Zeitstempeln benötigen:

Ziel 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow