Risposte:
Credo che questo sia il selettore di NSDate che stai cercando:
- (NSTimeInterval)timeIntervalSince1970
Un timestamp Unix è il numero di secondi a partire dalle 00:00:00 UTC del 1 ° gennaio 1970. È rappresentato dal tipo time_t , che di solito è un tipo intero a 32 bit con segno (long o int).
iOS fornisce - (NSTimeInterval) timeIntervalSince1970 per gli oggetti NSDate che restituisce il numero di secondi a partire dalle 00:00:00 GMT del 1 ° gennaio 1970. NSTimeInterval è un doppio tipo a virgola mobile in modo da ottenere i secondi e le frazioni di secondo.
Poiché entrambi hanno lo stesso riferimento (mezzanotte 1 gennaio 1970 UTC) e sono entrambi in pochi secondi, la conversione è semplice, converti NSTimeInterval in time_t, arrotondando o troncando a seconda delle tue esigenze:
time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
int unixTime = floor([piece.piece_last_view timeIntervalSince1970])
dove piece.piece.last_view è un NSDate
In questo modo puoi creare una data timestamp unix da una data:
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;
}
NOTA: - Il timestamp deve essere nella zona UTC, quindi converto l'ora locale in ora UTC.
Aggiornato per Swift 3
// current date and time
let someDate = Date()
// time interval since 1970
let myTimeStamp = someDate.timeIntervalSince1970
Appunti
timeIntervalSince1970
restituisce TimeInterval
, che è un typealias per Double
.
Se volessi andare dall'altra parte, potresti fare quanto segue:
let myDate = Date(timeIntervalSince1970: myTimeStamp)
Se si desidera archiviare questi tempi in un database o inviarli sul server ... è preferibile utilizzare i timestamp Unix. Ecco un piccolo frammento per ottenerlo:
+ (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];
}
[[NSTimeZone systemTimeZone] secondsFromGMT]]
:? Per favore, spiega poco.
Come da suggerimento di @ kexik usando la funzione di tempo UNIX come di seguito:
time_t result = time(NULL);
NSLog([NSString stringWithFormat:@"The current Unix epoch time is %d",(int)result]);
Secondo la mia esperienza - non usare timeIntervalSince1970, dà il timestamp di epoca - il numero di secondi che sei dietro GMT.
C'era un bug con [[NSDate date] timeIntervalSince1970], usato per aggiungere / sottrarre il tempo in base al fuso orario del telefono, ma sembra essere risolto ora.
[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]];
prima volta unixtime 1532278070
secondo unixtime 1532278070.461380
terza volta unixtime 1532278070