Szukaj…


Składnia

  • NSDate () // Inicjalizacja obiektu NSDate do bieżącej daty i godziny
  • NSDate (). TimeIntervalSince1970 // Bieżąca data i godzina w sekundach od 00:00:00 UTC 1 stycznia 1970 r.
  • NSDate (). NSComparisonResult (other: NSDate) // Zwraca porównanie bieżącej daty z inną datą zwraca NSComparisonResult

Uwagi

Istnieją różne typy formatu daty, które można ustawić: Oto pełna ich lista.

Format Znaczenie / opis Przykład 1 Przykład 2
y Rok z co najmniej 1 cyfrą. 175 ne → „175” 2016 AD → „2016”
tak Rok z dokładnie 2 cyframi. 5 AD → „05” 2016 AD → „16”
tak Rok z co najmniej 3 cyframi. 5 AD → „005” 2016 AD → „2016”
rrrr Rok z co najmniej 4 cyframi. 5 AD → „0005” 2016 AD → „2016”
M. Miesiąc z co najmniej 1 cyfrą. Lipiec → „7” „Listopad” → „11”
MM Miesiąc z co najmniej 2 cyframi. Lipiec → „07” „Listopad” → „11”
MMM Trzyliterowy skrót miesiąca. Lipiec → „lipiec” „Listopad” → „lis”
MMMM Pełna nazwa miesiąca. Lipiec → „lipiec” „Listopad” → „Listopad”
MMMMM Jeden litrowy skrót miesiąca (styczeń, czerwiec, lipiec wszystkie będą miały „J”). Lipiec → „J” „Listopad” → „N”
re Dzień z co najmniej jedną cyfrą. 8 → „8” 29 → „29”
dd Dzień z co najmniej dwiema cyframi. 8 → „08” 29 → „29”
„E”, „EE” lub „EEE” 3-literowy skrót nazwy dnia. Poniedziałek → „pon” Czwartek → „czw”
EEEE Imię i nazwisko Poniedziałek → „poniedziałek” Czwartek → „czwartek”
EEEEE 1-literowy skrót nazwy dnia. (Czw i Wt będą mieć literę „T”) Poniedziałek → „M” Czwartek → „T”
EEEEEE 2-literowy skrót nazwy dnia. Poniedziałek → „Mo” Czwartek → „Th”
za Okres dnia (AM / PM). 22:00 → „PM” 2:00 → „AM”
h Godzina 1-12 z co najmniej 1 cyfrą. 22:00 → „10” 2:00 → „2”
hh Godzina 1-12 z co najmniej 2 cyframi. 22:00 → „10” 2:00 → „02”
H. Godzina 0-23 z co najmniej 1 cyfrą. 22.00 → „14” 2:00 → „2”
HH Godzina 0–23 z co najmniej 2 cyframi. 22.00 → „14” 2:00 → „02”
m Minuta z co najmniej 1 cyfrą. 7 → „7” 29 → „29”
mm Minuta z co najmniej 2 cyframi. 7 → „07” 29 → „29”
s Druga z co najmniej 1 cyfrą. 7 → „7” 29 → „29”
ss Druga z co najmniej 2 cyframi. 7 → „07” 29 → „29”

Jest wiele innych, pozwalających uzyskać inny czas w oparciu o strefę (z), uzyskać czas z danymi milisekundowymi (S) itp.

Uzyskaj aktualną datę

Uzyskanie aktualnej daty jest bardzo łatwe. Otrzymasz obiekt NSDate bieżącej daty w jednym wierszu w następujący sposób:

Szybki

var date = NSDate()

Szybki 3

var date = Date()

Cel C

NSDate *date = [NSDate date];

Uzyskaj NSDate Object N sekund od bieżącej daty

Liczba sekund od bieżącej daty i godziny dla nowej daty. Użyj wartości ujemnej, aby określić datę przed bieżącą datą.

W tym celu mamy metodę o nazwie dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate (Swift) lub + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds (Objective-C).

Teraz, na przykład, jeśli potrzebujesz daty na tydzień od bieżącej daty i na tydzień od bieżącej daty, możemy to zrobić jako.

Szybki

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)

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

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

Porównanie dat

Istnieją 4 metody porównywania dat:

Szybki

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

Cel C

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

Powiedzmy, że mamy 2 daty:

Szybki

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

Cel C

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

Następnie, aby je porównać, wypróbujmy następujący kod:

Szybki

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
}

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

Jeśli chcesz porównać daty i obsłużyć sekundy, tygodnie, miesiące i lata:

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

Lub możesz użyć tego dla każdego komponentu:

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

Uzyskaj czas Epoki uniksowej

Aby uzyskać czas epoki uniksowej , użyj stałej timeIntervalSince1970 :

Szybki

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

Cel C

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

NSDateFormatter

Konwersja obiektu NSDate na ciąg znaków to zaledwie 3 kroki.

1. Utwórz obiekt NSDateFormatter

Szybki

let dateFormatter = NSDateFormatter()

Szybki 3

let dateFormatter = DateFormatter()

Cel C

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

2. Ustaw format daty, w której chcesz ciąg

Szybki

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

Cel C

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

3. Uzyskaj sformatowany ciąg

Szybki

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

Szybki 3

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

Cel C

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

To da wynik 2001-01-02 at 13:00 taki: 2001-01-02 at 13:00

Uwaga

Utworzenie instancji NSDateFormatter jest kosztowną operacją, dlatego zaleca się jej utworzenie raz i ponowne użycie, jeśli to możliwe.

Przydatne rozszerzenie do konwersji daty na ciąg.

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

Przydatne linki do szybkiego tworzenia dat i szybkiego tworzenia -daty-czytelnej-daty-nsdateformattera .

Informacje na temat konstruowania formatów dat można znaleźć we wzorcach formatu daty .

Konwertuj NSDate, który składa się z godziny i minuty (tylko) do pełnego NSDate

Istnieje wiele przypadków, w których utworzono NSDate tylko z formatu godziny i minuty, tj .: 08:12, który zwraca się z serwera jako ciąg znaków, a instancję NSDate inicjuje się tylko na podstawie tych wartości.

Minusem tej sytuacji jest to, że twoja NSDate jest prawie całkowicie „naga”, i musisz stworzyć: dzień, miesiąc, rok, drugą i strefę czasową, aby ten obiekt „grał” z innymi typami NSDate.

Na przykład powiedzmy, że hourAndMinute jest typem NSDate, który składa się z formatu godziny i minuty:

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

Teraz twój obiekt jest całkowitym przeciwieństwem bycia „nagim”.

Przesunięcie czasu UTC od NSDate z TimeZone

Tutaj obliczone zostanie przesunięcie czasu UTC od bieżących danych w żądanej strefie czasowej.

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

Uzyskaj typ cyklu czasowego (12-godzinny lub 24-godzinny)

Sprawdzanie, czy bieżąca data zawiera symbol AM lub PM

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

Żądanie typu cyklu czasowego od NSDateFormatter

Cel C

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

To używa specjalnego ciągu szablonu daty o nazwie „j”, który zgodnie ze specyfikacją ICU ...

[...] żąda preferowanego formatu godziny dla ustawień regionalnych (h, H, K lub k), określonego przez preferowany atrybut elementu godziny w danych uzupełniających. [...] Zauważ, że użycie „j” w szkielecie przekazanym do API jest jedynym sposobem, aby szkielet zażądał preferowanego typu cyklu czasowego lokalizacji (12-godzinny lub 24-godzinny).

To ostatnie zdanie jest ważne. Jest to „jedyny sposób, aby szkielet zażądał preferowanego typu cyklu czasowego lokalizacji”. Ponieważ NSDateFormatter i NSCalendar są zbudowane na bibliotece ICU, to samo dotyczy tutaj.

Odniesienie

Druga opcja pochodzi z tej odpowiedzi .

Pobierz NSDate z formatu daty JSON „/ Data (1268123281843) /”

Przed wersją Json.NET 4.5 zapisywano daty w formacie Microsoft: „/ Date (1198908717056) /”. Jeśli Twój serwer wysyła datę w tym formacie, możesz użyć poniższego kodu do serializacji go do NSDate:

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

Uzyskaj historyczny czas z NSDate (np. 5 s temu, 2 min temu, 3 godz. Temu)

Można tego użyć w różnych aplikacjach czatu, kanałach RSS i aplikacjach społecznościowych, w których musisz mieć najnowsze kanały ze znacznikami czasu:

Cel 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow