Szukaj…


Uwagi

NSDate jest bardzo prostym typem wartości, reprezentującym jeden dokładny moment w czasie uniwersalnym. Nie zawiera informacji o strefach czasowych, czasie letnim, kalendarzach ani ustawieniach regionalnych.

NSDate jest tak naprawdę niezmiennym opakowaniem wokół NSTimeInterval który jest double . Nie istnieje zmienna podklasa, jak w przypadku niektórych innych typów wartości w Foundation.

Tworzenie NSDate

Klasa NSDate zapewnia metody tworzenia obiektów NSDate odpowiadających danej dacie i godzinie. NSDate można zainicjować za pomocą wyznaczonego inicjatora, który:

Zwraca obiekt NSDate zainicjowany względem 00:00:00 UTC w dniu 1 stycznia 2001 r. O określoną liczbę sekund.

NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:100.0];

NSDate zapewnia również łatwy sposób na utworzenie NSDate równego bieżącej dacie i godzinie:

NSDate *now = [NSDate date];

Możliwe jest również utworzenie daty NSDate w określonej liczbie sekund od bieżącej daty i godziny:

NSDate *tenSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:10.0];

Porównanie dat

Istnieją 4 metody porównywania NSDate w Objective-C:

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

Rozważ następujący przykład z użyciem 2 dat, daty NSDate date1 = July 7, 2016 I daty NSDate date2 = July 2, 2016 :

NSDateComponents *comps1 = [[NSDateComponents alloc]init];
comps.year = 2016;
comps.month = 7;
comps.day = 7;

NSDateComponents *comps2 = [[NSDateComponents alloc]init];
    comps.year = 2016;
    comps.month = 7;
    comps.day = 2;

NSDate* date1 = [calendar dateFromComponents:comps1]; //Initialized as July 7, 2016 
NSDate* date2 = [calendar dateFromComponents:comps2]; //Initialized as July 2, 2016 

Teraz, gdy tworzone są NSDate , można je porównać:

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

Możemy również użyć earlierDate: i laterDate: metod NSDate klasy:

NSDate *earlierDate = [date1 earlierDate:date2];//Returns the earlier of 2 dates. Here earlierDate will equal date2.
NSDate *laterDate = [date1 laterDate:date2];//Returns the later of 2 dates. Here laterDate will equal date1.

Na koniec możemy użyć metody compare: NSDate :

NSComparisonResult result = [date1 compare:date2];
    if (result == NSOrderedAscending) {
        //Fails
        //Comes here if date1 is earlier than date2. In our case it will not come here.
    }else if (result == NSOrderedSame){
        //Fails
        //Comes here if date1 is the 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
    }

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 na podstawie formatu godziny i minuty, np .: 08:12

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:

NSDateComponents *hourAndMintuteComponents = [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: [hourAndMintuteComponents hour]];
[components setMinute: [hourAndMintuteComponents minute]];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone defaultTimeZone]];

NSDate *yourFullNSDateObject = [calendar dateFromComponents:components];

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

Konwertowanie NSDate na NSString

Jeśli ww mamy obiekt NSDate i chcemy przekonwertować go na NSString. Istnieją różne typy ciągów daty. Jak możemy to zrobić ?, To bardzo proste. Tylko 3 kroki.

  1. Utwórz obiekt NSDateFormatter
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  1. Ustaw format daty, w której chcesz ciąg.
    dateFormatter.dateFormat = @"yyyy-MM-dd 'at' HH:mm";
  1. Teraz pobierz sformatowany ciąg

     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.



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