Recherche…


Syntaxe

  • NSDate () // objet NSDate init à la date et l'heure actuelles
  • NSDate (). TimeIntervalSince1970 // Date et heure actuelles en nombre de secondes entre 00:00:00 UTC le 1er janvier 1970.
  • NSDate (). Compare (other: NSDate) // Retourne une comparaison de la date du jour à une autre date renvoie un NSComparisonResult

Remarques

Il existe différents types de format de date que vous pouvez définir: Voici leur liste complète.

Format Signification / Description Exemple 1 Exemple2
y Une année avec au moins 1 chiffre. 175 après JC → “175” 2016 AD → “2016”
yy Une année avec exactement 2 chiffres. 5 AD → “05” 2016 AD → “16”
yyy Une année avec au moins 3 chiffres. 5 AD → “005” 2016 AD → “2016”
aaaa Une année avec au moins 4 chiffres. 5 AD → “0005” 2016 AD → “2016”
M Un mois avec au moins 1 chiffre. Juillet → 7 "Novembre" → "11"
MM Un mois avec au moins 2 chiffres. Juillet → 07 "Novembre" → "11"
MMM Abréviation de trois lettres par mois. Juillet → “Jul” "Novembre" → "Nov"
MMMM Nom complet du mois. Juillet → juillet "Novembre" → "Novembre"
MMMMM Abréviation d'un mois (janvier, juin et juillet, tous auront un «J»). Juillet → “J” "Novembre" → "N"
Jour avec au moins un chiffre. 8 → “8” 29 → “29”
dd Jour avec au moins deux chiffres. 8 → “08” 29 → “29”
"E", "EE" ou "EEE" Abréviation de jour en 3 lettres du nom du jour. Lundi → “Mon” Jeudi → “jeu”
EEEE Nom de la journée complète Lundi → lundi Jeudi → jeudi
EEEEE Abréviation de 1 lettre jour du nom du jour (le jeu et le mardi seront «T») Lundi → “M” Jeudi → “T”
EEEEEE Abréviation de jour en 2 lettres du nom du jour. Lundi → “Mo” Jeudi → “Th”
une Période de la journée (AM / PM). 22 heures → «PM» 2 heures du matin → "AM"
h Une heure basée sur 1-12 avec au moins 1 chiffre. 22h → “10” 2 heures → «2»
hh Une heure basée sur 1-12 avec au moins 2 chiffres. 22h → 10h 2 heures → «02»
H Une heure basée sur 0-23 avec au moins 1 chiffre. 22h → “14” 2 heures → «2»
HH Une heure basée sur 0-23 avec au moins 2 chiffres. 22h → “14” 2 heures → «02»
m Une minute avec au moins 1 chiffre. 7 → “7” 29 → “29”
mm Une minute avec au moins 2 chiffres. 7 → “07” 29 → “29”
s Une seconde avec au moins 1 chiffre. 7 → “7” 29 → “29”
ss Une seconde avec au moins 2 chiffres. 7 → “07” 29 → “29”

Il y en a beaucoup d'autres, pour obtenir un temps différent en fonction de la zone (z), pour obtenir du temps avec des détails en millisecondes (S), etc.

Obtenir la date actuelle

Obtenir la date actuelle est très facile. Vous obtenez l'objet NSDate de la date actuelle en une seule ligne comme suit:

Rapide

var date = NSDate()

Swift 3

var date = Date()

Objectif c

NSDate *date = [NSDate date];

Obtenir l'objet NSDate N secondes à partir de la date actuelle

Le nombre de secondes à partir de la date et de l'heure actuelles pour la nouvelle date. Utilisez une valeur négative pour spécifier une date avant la date actuelle.

Pour ce faire, nous avons une méthode nommée dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate (Swift) ou + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds (Objective-C).

Maintenant, par exemple, si vous avez besoin d'une date d'une semaine à partir de la date actuelle et d'une semaine à la date actuelle, nous pouvons le faire comme.

Rapide

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)

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

Comparaison de date

Il existe 4 méthodes pour comparer les dates:

Rapide

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

Objectif c

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

Disons que nous avons 2 dates:

Rapide

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

Objectif c

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

Ensuite, pour les comparer, nous essayons ce code:

Rapide

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
}

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

Si vous voulez comparer les dates et gérer les secondes, les semaines, les mois et les années:

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

Ou vous pouvez l'utiliser pour chaque composant:

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

Obtenez le temps Unix Epoch

Pour obtenir l’ époque Unix , utilisez la constante timeIntervalSince1970 :

Rapide

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

Objectif c

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

NSDateFormatter

La conversion d'un objet NSDate en chaîne ne NSDate que 3 étapes.

1. Créez un objet NSDateFormatter

Rapide

let dateFormatter = NSDateFormatter()

Swift 3

let dateFormatter = DateFormatter()

Objectif c

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

2. Définissez le format de date dans lequel vous voulez que votre chaîne

Rapide

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

Objectif c

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

3. Obtenez la chaîne formatée

Rapide

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

Swift 3

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

Objectif c

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

Cela donnera quelque chose comme ceci: 2001-01-02 at 13:00

Remarque

La création d'une instance NSDateFormatter est une opération coûteuse. Il est donc recommandé de la créer une fois et de la réutiliser si possible.

Extension utile pour convertir la date en chaîne.

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

Des liens utiles pour une formation rapide des dates rapidement-get-lisible par l'homme-date-nsdateformatter .

Pour construire des formats de date, voir les modèles de format de date .

Convertir NSDate composé d'heures et de minutes (uniquement) en un NSDate complet

Il y a de nombreux cas où l'on a créé un NSDate uniquement à partir d'un format heure et minute, à savoir: 08:12 qui renvoie depuis un serveur en tant que chaîne et que vous initiez une instance NSDate uniquement avec ces valeurs.

L'inconvénient de cette situation est que votre NSDate est presque complètement "nu" et que vous devez créer: jour, mois, année, seconde et fuseau horaire pour que cet objet "joue" avec d'autres types de NSDate.

Pour l'exemple, supposons que hourAndMinute est le type NSDate composé du format heure et minute:

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

Maintenant, votre objet est le contraire total d'être "nu".

UTC Time offset à partir de NSDate avec TimeZone

Ici, le temps UTC est calculé à partir des données actuelles dans le fuseau horaire souhaité.

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

Obtenir le type de cycle horaire (12 heures ou 24 heures)

Vérifier si la date actuelle contient le symbole pour AM ou PM

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

Demander le type de cycle temporel à partir de NSDateFormatter

Objectif c

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

Cela utilise une chaîne de modèle de date spéciale appelée "j" qui, selon les spécifications ICU ...

[...] demande le format d'heure préféré pour les paramètres régionaux (h, H, K ou k), déterminé par l'attribut préféré de l'élément hours dans les données supplémentaires. [...] Notez que l'utilisation de 'j' dans un squelette transmis à une API est la seule façon de demander à un squelette le type de cycle temporel préféré de l'environnement local (12 heures ou 24 heures).

Cette dernière phrase est importante. Il "est le seul moyen de demander à un squelette le type de cycle temporel préféré de l'environnement local". Puisque NSDateFormatter et NSCalendar sont construits sur la bibliothèque ICU, la même chose est vraie ici.

Référence

La deuxième option est dérivée de cette réponse .

Obtenir NSDate à partir du format de date JSON "/ Date (1268123281843) /"

Avant Json.NET 4.5, les dates étaient écrites au format Microsoft: "/ Date (1198908717056) /". Si votre serveur envoie la date dans ce format, vous pouvez utiliser le code ci-dessous pour le sérialiser à NSDate:

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

Obtenez le temps historique de NSDate (ex: 5 il y a, il y a 2 heures, 3 heures)

Cela peut être utilisé dans diverses applications de discussion, flux RSS et applications sociales où vous devez disposer des derniers flux avec horodatage:

Objectif 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow