Comment convertir une NSDate
en horodatage Unix? J'ai lu beaucoup d'articles qui font l'inverse. Mais je ne trouve rien en relation avec ma question.
Je crois que c'est le sélecteur de NSDate que vous recherchez:
- (NSTimeInterval)timeIntervalSince1970
Un horodatage Unix correspond au nombre de secondes écoulées depuis le 1er janvier 1970 à 00:00:00 UTC. Il est représenté par le type time_t , qui est généralement un type entier signé de 32 bits (long ou int). .
iOS fournit - (NSTimeInterval) timeIntervalSince1970 pour les objets NSDate qui renvoie le nombre de secondes écoulées depuis le 1er janvier 1970 à 00:00:00 GMT. NSTimeInterval est un type à virgule flottante double pour obtenir les secondes et les fractions de seconde.
Puisqu'ils ont tous les deux la même référence (minuit, le 1 janvier 1970) et qu'ils sont tous les deux en quelques secondes, la conversion est facile, convertissez NSTimeInterval en time_t, arrondi ou tronqué en fonction de vos besoins:
time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
Vous pouvez créer une date d'horodatage Unix à partir d'une date de cette façon:
NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
- (void)GetCurrentTimeStamp
{
NSDateFormatter *objDateformat = [[NSDateFormatter alloc] init];
[objDateformat setDateFormat:@"yyyy-MM-dd"];
NSString *strTime = [objDateformat stringFromDate:[NSDate date]];
NSString *strUTCTime = [self GetUTCDateTimeFromLocalTime:strTime];//You can pass your date but be carefull about your date format of NSDateFormatter.
NSDate *objUTCDate = [objDateformat dateFromString:strUTCTime];
long long milliseconds = (long long)([objUTCDate timeIntervalSince1970] * 1000.0);
NSString *strTimeStamp = [Nsstring stringwithformat:@"%lld",milliseconds];
NSLog(@"The Timestamp is = %@",strTimestamp);
}
- (NSString *) GetUTCDateTimeFromLocalTime:(NSString *)IN_strLocalTime
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *objDate = [dateFormatter dateFromString:IN_strLocalTime];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSString *strDateTime = [dateFormatter stringFromDate:objDate];
return strDateTime;
}
NOTE: - L'horodatage doit être dans la zone UTC. Je convertis donc l'heure locale en heure UTC.
_ {Mis à jour pour Swift 3} _
// current date and time
let someDate = Date()
// time interval since 1970
let myTimeStamp = someDate.timeIntervalSince1970
Remarques
timeIntervalSince1970
renvoie TimeInterval
, qui est un typealias pour Double
.Si vous voulez aller dans l'autre sens, vous pouvez faire ce qui suit:
let myDate = Date(timeIntervalSince1970: myTimeStamp)
Ma manière préférée est simplement:
NSDate.date.timeIntervalSince1970;
Si vous souhaitez stocker ces heures dans une base de données ou les envoyer sur le serveur ... utilisez de préférence les horodatages Unix. Voici un petit extrait pour l'obtenir:
+ (NSTimeInterval)getUTCFormateDate{
NSDateComponents *comps = [[NSCalendar currentCalendar]
components:NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit
fromDate:[NSDate date]];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:[[NSTimeZone systemTimeZone] secondsFromGMT]];
return [[[NSCalendar currentCalendar] dateFromComponents:comps] timeIntervalSince1970];
}
Selon les suggestions de @ kexik, utilisez la fonction de temps UNIX comme suit:
time_t result = time(NULL);
NSLog([NSString stringWithFormat:@"The current Unix Epoch time is %d",(int)result]);
Selon mon expérience - n’utilisez pas timeIntervalSince1970, cela donne l’horodatage de la période - le nombre de secondes que vous avez par rapport à GMT.
Il y avait un bogue avec [[NSDate date] timeIntervalSince1970], il était utilisé pour ajouter/soustraire du temps en fonction du fuseau horaire du téléphone, mais il semble être résolu maintenant.
[NSString stringWithFormat: @"first unixtime is %ld",message,(long)[[NSDate date] timeIntervalSince1970]];
[NSString stringWithFormat: @"second unixtime is %ld",message,[[NSDate date] timeIntervalSince1970]];
[NSString stringWithFormat: @"third unixtime is %.0f",message,[[NSDate date] timeIntervalSince1970]];
premier unixtime 1532278070
deuxième unixtime 1532278070.461380
troisième heure unixtime 1532278070
Si vous avez besoin de l'horodatage sous forme de chaîne.
time_t result = time(NULL);
NSString *timeStampString = [@(result) stringValue];