webentwicklung-frage-antwort-db.com.de

iOS: Konvertieren Sie das UTC-NSDate in eine lokale Zeitzone

Wie konvertiere ich ein UTC NSDate in lokales Zeitzonen-NSDate in Objective C oder/und Swift?

123
Zap
NSTimeInterval seconds; // assume this exists
NSDate* ts_utc = [NSDate dateWithTimeIntervalSince1970:seconds];

NSDateFormatter* df_utc = [[[NSDateFormatter alloc] init] autorelease];
[df_utc setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[df_utc setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];

NSDateFormatter* df_local = [[[NSDateFormatter alloc] init] autorelease];
[df_local setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];
[df_local setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];

NSString* ts_utc_string = [df_utc stringFromDate:ts_utc];
NSString* ts_local_string = [df_local stringFromDate:ts_utc];

// you can also use NSDateFormatter dateFromString to go the opposite way

Tabelle der Parameter für die Formatierungszeichenfolge:

https://waracle.com/iphone-nsdateformatter-date-formatting-table/

Wenn Leistung eine Priorität ist, möchten Sie möglicherweise die Verwendung von strftime in Betracht ziehen.

https://developer.Apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/strftime.3.html

136
slf

EDIT Als ich das schrieb, wusste ich nicht, dass ich einen Datumsformatierer verwenden sollte, der wahrscheinlich ein besserer Ansatz ist. Überprüfen Sie daher auch die Antwort von slf.

Ich habe einen Webservice, der Datumsangaben in UTC zurückgibt. Ich verwende toLocalTime, um sie in Ortszeit umzuwandeln, und toGlobalTime, um sie bei Bedarf zurück zu konvertieren.

Hier habe ich meine Antwort erhalten:

https://agilewarrior.wordpress.com/2012/06/27/wie-zu-konvertieren-nachrichten-zum-differenzierten-Zeitzonen/

@implementation NSDate(Utils)

-(NSDate *) toLocalTime
{
  NSTimeZone *tz = [NSTimeZone defaultTimeZone];
  NSInteger seconds = [tz secondsFromGMTForDate: self];
  return [NSDate dateWithTimeInterval: seconds sinceDate: self];
}

-(NSDate *) toGlobalTime
{
  NSTimeZone *tz = [NSTimeZone defaultTimeZone];
  NSInteger seconds = -[tz secondsFromGMTForDate: self];
  return [NSDate dateWithTimeInterval: seconds sinceDate: self];
}

@end
105
gyozo kudor

Die einfachste Methode, die ich gefunden habe, ist folgende:

NSDate *someDateInUTC = …;
NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT];
NSDate *dateInLocalTimezone = [someDateInUTC dateByAddingTimeInterval:timeZoneSeconds];
46
Sendoa

Wenn Sie lokales Datum und Uhrzeit wünschen. Versuchen Sie diesen Code: -

NSString *localDate = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle];
25

Swift 3+ : UTC zu Lokal und Lokal zu UTC

extension Date {

    // Convert UTC (or GMT) to local time
    func toLocalTime() -> Date {
        let timezone = TimeZone.current
        let seconds = TimeInterval(timezone.secondsFromGMT(for: self))
        return Date(timeInterval: seconds, since: self)
    }

    // Convert local time to UTC (or GMT)
    func toGlobalTime() -> Date {
        let timezone = TimeZone.current
        let seconds = -TimeInterval(timezone.secondsFromGMT(for: self))
        return Date(timeInterval: seconds, since: self)
    }
}
23
Krunal

Die Eingabe ist ein String. CurrentUTCTime (im Format 30.08.2012 11:11) konvertiert die Eingabezeit in GMT in eine vom System eingestellte Zonenzeit

//UTC time
NSDateFormatter *utcDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[utcDateFormatter setDateFormat:@"MM/dd/yyyy HH:mm"];
[utcDateFormatter setTimeZone :[NSTimeZone timeZoneForSecondsFromGMT: 0]];

// utc format
NSDate *dateInUTC = [utcDateFormatter dateFromString: currentUTCTime];

// offset second
NSInteger seconds = [[NSTimeZone systemTimeZone] secondsFromGMT];

// format it and send
NSDateFormatter *localDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[localDateFormatter setDateFormat:@"MM/dd/yyyy HH:mm"];
[localDateFormatter setTimeZone :[NSTimeZone timeZoneForSecondsFromGMT: seconds]];

// formatted string
NSString *localDate = [localDateFormatter stringFromDate: dateInUTC];
return localDate;
6
Ashwin Kumar

Konvertieren Sie Ihr UTC-Datum in ein lokales Datum

-(NSString *)getLocalDateTimeFromUTC:(NSString *)strDate
{
    NSDateFormatter *dtFormat = [[NSDateFormatter alloc] init];
    [dtFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    [dtFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    NSDate *aDate = [dtFormat dateFromString:strDate];

    [dtFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    [dtFormat setTimeZone:[NSTimeZone systemTimeZone]];

    return [dtFormat stringFromDate:aDate];
}

Verwenden Sie so

NSString *localDate = [self getLocalDateTimeFromUTC:@"yourUTCDate"];
5
Vvk

Konvertiere das Datum aus dem UTC-Kalender in ein Datum mit der entsprechenden lokalen NSTimeZone .

3
user23743
//This is basic way to get time of any GMT time.

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"hh:mm a"];  // 09:30 AM
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:1]]; // For GMT+1
NSString *time = [formatter stringFromDate:[NSDate date]];  // Current time
3
Linh Nguyen

Ich schreibe diese Methode, um die Uhrzeit in unsere LocalTimeZone umzuwandeln

-Hier (NSString *) Der Parameter TimeZone ist eine Server-Zeitzone

-(NSString *)convertTimeIntoLocal:(NSString *)defaultTime :(NSString *)TimeZone
{
    NSDateFormatter *serverFormatter = [[NSDateFormatter alloc] init];
    [serverFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:TimeZone]];
    [serverFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *theDate = [serverFormatter dateFromString:defaultTime];
    NSDateFormatter *userFormatter = [[NSDateFormatter alloc] init];
    [userFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    [userFormatter setTimeZone:[NSTimeZone localTimeZone]];
    NSString *dateConverted = [userFormatter stringFromDate:theDate];
    return dateConverted;
}
2
imjaydeep

Da niemand NSDateComponents zu verwenden schien, dachte ich, ich würde eins in ....__ angeben: In dieser Version wird keine NSDateFormatter verwendet, also kein String-Parsing, und NSDate wird nicht zur Darstellung der Zeit außerhalb von GMT (UTC) verwendet. . Die ursprüngliche NSDate befindet sich in der Variablen i_date.

NSCalendar *anotherCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:i_anotherCalendar];
anotherCalendar.timeZone = [NSTimeZone timeZoneWithName:i_anotherTimeZone];

NSDateComponents *anotherComponents = [anotherCalendar components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitNanosecond) fromDate:i_date];

// The following is just for checking   
anotherComponents.calendar = anotherCalendar; // anotherComponents.date is nil without this
NSDate *anotherDate = anotherComponents.date;

i_anotherCalendar könnte NSCalendarIdentifierGregorian oder ein anderer Kalender sein ..__ Die NSString, die für i_anotherTimeZone zulässig ist, kann mit [NSTimeZone knownTimeZoneNames] abgerufen werden, anotherCalendar.timeZone könnte jedoch [NSTimeZone defaultTimeZone] oder [NSTimeZone localTimeZone] oder [NSTimeZone systemTimeZone] insgesamt sein.

Es ist tatsächlich anotherComponents, die Zeit in der neuen Zeitzone zu halten. Sie werden feststellen, dass anotherDate gleich i_date ist, da sie die Zeit in GMT (UTC) enthält.

1
techniao

Sie können dieses versuchen:

NSDate *currentDate = [[NSDate alloc] init];
NSTimeZone *timeZone = [NSTimeZone defaultTimeZone];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
[dateFormatter setTimeStyle:NSDateFormatterLongStyle];
[dateFormatter setTimeZone:timeZone];
[dateFormatter setDateFormat:@"ZZZ"];
NSString *localDateString = [dateFormatter stringFromDate:currentDate];
NSMutableString *mu = [NSMutableString stringWithString:localDateString];
[mu insertString:@":" atIndex:3];
 NSString *strTimeZone = [NSString stringWithFormat:@"(GMT%@)%@",mu,timeZone.name];
 NSLog(@"%@",strTimeZone);
0