Sök…


Syntax

  • NSDate () // NSDate-objekt init till aktuellt datum och tid
  • NSDate (). TimeIntervalSince1970 // Aktuellt datum och tid i antal sekunder från 00:00:00 UTC den 1 januari 1970.
  • NSDate (). Jämför (annat: NSDate) // Returnerar en jämförelse av aktuellt datum till ett annat datum returnerar ett NSComparisonResult

Anmärkningar

Det finns olika typer av datumformat som du kan ställa in: Här är en fullständig lista över dem.

Formatera Betydelse / Beskrivning Exempel 1 example2
y Ett år med minst 1 siffra. 175 e.Kr. → “175” 2016 AD → “2016”
yy Ett år med exakt två siffror. 5 AD → “05” 2016 AD → “16”
yyy Ett år med minst 3 siffror. 5 AD → “005” 2016 AD → “2016”
yyyy Ett år med minst fyra siffror. 5 e.Kr. → “0005” 2016 AD → “2016”
M En månad med minst 1 siffra. Juli → “7” "November" → "11"
MM En månad med minst 2 siffror. Juli → “07” "November" → "11"
MMM Tre bokstavsmånaders förkortning. Juli → “jul” "November" → "nov"
MMMM Månadens fulla namn. Juli → “juli” "November" → "november"
MMMMM En bokstavsmånadförkortning (Jan, juni, juli kommer alla att ha 'J'). Juli → “J” "November" → "N"
d Dag med minst en siffra. 8 → “8” 29 → “29”
dd Dag med minst två siffror. 8 → “08” 29 → “29”
"E", "EE" eller "EEE" 3 bokstavsdag förkortning av dagnamn. Måndag → “Man” Torsdag → “Thu”
EEEE Hel dag namn. Måndag → “Måndag” Torsdag → “Torsdag”
eeeee 1 bokstavsdag förkortning av dagnamn. (Thu och Tue kommer att vara 'T') Måndag → “M” Torsdag → “T”
eeeeee 2 bokstavsdag förkortning av dagnamn. Måndag → “Mo” Torsdag → “Th”
en Dagstid (AM / PM). 22.00 → “PM” 02:00 → “AM”
h En 1-12 baserad timme med minst 1 siffra. 22.00 → “10” 02:00 → “2”
hh En 1-12 baserad timme med minst 2 siffror. 22.00 → “10” 02:00 → “02”
H En 0-23 baserad timme med minst 1 siffra. 22.00 → “14” 02:00 → “2”
HH En baserad timme på 0-23 med minst 2 siffror. 22.00 → “14” 02:00 → “02”
m En minut med minst 1 siffra. 7 → “7” 29 → “29”
mm En minut med minst 2 siffror. 7 → “07” 29 → “29”
s En sekund med minst 1 siffra. 7 → “7” 29 → “29”
ss En sekund med minst 2 siffror. 7 → “07” 29 → “29”

Det finns många fler, för att få olika tid baserade på zon (z), för att få tid med millisekunddetaljer (S), etc.

Få aktuellt datum

Att få aktuellt datum är väldigt enkelt. Du får NSDate-objektet med det aktuella datumet på en enda rad enligt följande:

Snabb

var date = NSDate()

Snabb 3

var date = Date()

Objective-C

NSDate *date = [NSDate date];

Hämta NSDate-objekt N sekunder från aktuellt datum

Antalet sekunder från det aktuella datumet och tiden för det nya datumet. Använd ett negativt värde för att ange ett datum före det aktuella datumet.

För att göra detta har vi en metod som heter dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate (Swift) eller + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds (Objekt-C).

Om du till exempel behöver ett datum en vecka från aktuellt datum och en vecka till aktuellt datum, kan vi göra det som.

Snabb

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)

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

Datumjämförelse

Det finns fyra metoder för att jämföra datum:

Snabb

  • 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

Låt oss säga att vi har två datum:

Snabb

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

Sedan, för att jämföra dem, försöker vi den här koden:

Snabb

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
}

Om du vill jämföra datum och hantera sekunder, veckor, månader och år:

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

Eller så kan du använda detta för varje komponent:

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

Få Unix Epoch-tid

För att få Unix Epoch Time använder du konstant timeIntervalSince1970 :

Snabb

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

Objective-C

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

NSDateFormatter

Att konvertera ett NSDate objekt till sträng är bara NSDate steg.

1. Skapa ett NSDateFormatter objekt

Snabb

let dateFormatter = NSDateFormatter()

Snabb 3

let dateFormatter = DateFormatter()

Objective-C

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

2. Ställ in datumformatet som du vill ha din sträng i

Snabb

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

Objective-C

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

3. Hämta den formaterade strängen

Snabb

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

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

Detta ger utdata något så här: 2001-01-02 at 13:00

Notera

Att skapa en NSDateFormatter instans är en dyr operation, så det rekommenderas att skapa det en gång och återanvända när det är möjligt.

Användbar förlängning för att konvertera datum till sträng.

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

Användbara länkar för snabb datumformning snabbt-få-mänsklig-läsbar-datum-nsdateformatter .

För konstruktion av datumformat se datumformatmönster .

Konvertera NSDate som är sammansatt från timme och minut (endast) till en fullständig NSDate

Det finns många fall när man har skapat en NSDate från endast en timme- och minutformat, dvs: 08:12 som kommer tillbaka från en server som en sträng och du initierar en NSDate-instans endast med dessa värden.

Nackdelen med denna situation är att din NSDate är nästan helt "naken" och vad du behöver göra är att skapa: dag, månad, år, sekund och tidszon för att detta objekt ska "spela med" med andra NSDate-typer.

För exempelets skull låt oss säga att hourAndMinute är NSDate-typen som består av timme- och minutformat:

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

Nu är ditt objekt den totala motsatsen till att vara "naken".

UTC Tidsförskjutning från NSDate med TimeZone

Här kommer detta att beräkna UTC tidsförskjutningen från aktuell information i önskad tidszon.

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

Få tidcykeltyp (12-timmars eller 24-timmars)

Kontrollera om det aktuella datumet innehåller symbolen för AM eller 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);

Begär tidscykeltypen från NSDateFormatter

Objective-C

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

Detta använder en speciell datummallsträng som heter "j" som enligt ICU Spec ...

[...] begär det föredragna timformatet för landskapet (h, H, K eller k), bestämt av det föredragna attributet för timmeelementet i kompletterande data. [...] Observera att användning av 'j' i ett skelett som skickas till ett API är det enda sättet att få ett skelett att begära ett landets önskade tidcykeltyp (12-timmars eller 24-timmars).

Den sista meningen är viktig. Det är "det enda sättet att få ett skelett att begära ett landets föredragna tidscykeltyp". Eftersom NSDateFormatter och NSCalendar är byggda på ICU-biblioteket, gäller det samma här.

Referens

Det andra alternativet härleddes från detta svar .

Hämta NSDate från JSON Datumformat "/ Date (1268123281843) /"

Före Json.NET 4,5 datum skrivdes med Microsoft-format: "/ Date (1198908717056) /". Om din server skickar datum i detta format kan du använda koden nedan för att serialisera den till 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;
}

Få historisk tid från NSDate (t.ex.: 5s sedan, 2m sedan, 3h sedan)

Detta kan användas i olika chatapplikationer, RSS-flöden och sociala appar där du behöver ha senaste flöden med tidsstämplar:

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow