ฉันจะแปลง UTC เป็นโซนเวลาNSDate
ท้องถิ่น NSDate ใน Objective C หรือ / และ Swift ได้อย่างไร
ฉันจะแปลง UTC เป็นโซนเวลาNSDate
ท้องถิ่น NSDate ใน Objective C หรือ / และ Swift ได้อย่างไร
คำตอบ:
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
ตารางการจัดรูปแบบพารามิเตอร์สตริง:
https://waracle.com/iphone-nsdateformatter-date-formatting-table/
หากประสิทธิภาพมีความสำคัญคุณอาจต้องพิจารณาการใช้ strftime
NSDate
จำเป็นต้องทำการแปลงวัตถุใด ๆ ซึ่งถูกต้อง การแปลงเป็นเขตเวลาเกิดขึ้นเมื่อมีการจัดรูปแบบวันที่ไม่ใช่เมื่อมีการสร้างเนื่องจากวันที่ไม่มีเขตเวลา
NSCalendarDate
เลิกใช้แล้ว
แก้ไขเมื่อฉันเขียนสิ่งนี้ฉันไม่รู้ว่าฉันควรใช้ Dateformatter ซึ่งอาจเป็นวิธีที่ดีกว่าดังนั้นลองดูslf
คำตอบด้วย
ฉันมีเว็บเซอร์วิซที่ส่งคืนวันที่ใน UTC ฉันใช้toLocalTime
เพื่อแปลงเป็นเวลาท้องถิ่นและtoGlobalTime
แปลงกลับหากจำเป็น
นี่คือที่ฉันได้รับคำตอบจาก:
https://agilewarrior.wordpress.com/2012/06/27/how-to-convert-nsdate-to-different-time-zones/
@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
วิธีที่ง่ายที่สุดที่ฉันพบคือ:
NSDate *someDateInUTC = …;
NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT];
NSDate *dateInLocalTimezone = [someDateInUTC dateByAddingTimeInterval:timeZoneSeconds];
secondsFromGMTForDate
ควรใช้หนึ่งรายการหากคุณต้องการบัญชีสำหรับการปรับเวลาตามฤดูกาล ดูเอกสารของ Apple
Swift 3+ : UTC เป็น Local และ Local เป็น 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)
}
}
หากคุณต้องการวันที่และเวลาท้องถิ่น ลองรหัสนี้: -
NSString *localDate = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle];
[NSDate date]
[NSDate dateWithNaturalLanguageString:sMyDateString]
แปลงวันที่ UTC ของคุณเป็นวันที่ท้องถิ่น
-(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];
}
ใช้แบบนี้
NSString *localDate = [self getLocalDateTimeFromUTC:@"yourUTCDate"];
อินพุตที่นี่คือสตริงปัจจุบัน UTCTime (ในรูปแบบ 08/30/2012 11:11) แปลงเวลาอินพุตใน GMT เป็นเวลาที่ตั้งค่าระบบ
//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;
//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
แปลงวันที่จากปฏิทิน UTC การหนึ่งที่มีในท้องถิ่นที่เหมาะสมNSTimeZone
ฉันเขียนวิธีนี้เพื่อแปลงเวลาวันที่เป็น LocalTimeZone ของเรา
- ที่นี่ (NSString *) พารามิเตอร์ TimeZone เป็นเขตเวลาของเซิร์ฟเวอร์
-(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;
}
เนื่องจากดูเหมือนจะไม่มีใครใช้NSDateComponents
ฉันคิดว่าฉันจะเลือกหนึ่งใน ... ในรุ่นนี้ไม่มีการNSDateFormatter
ใช้จึงไม่มีการแยกสตริงและNSDate
ไม่ได้ใช้เพื่อแสดงเวลานอก GMT (UTC) เดิมอยู่ในตัวแปรNSDate
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
อาจเป็นNSCalendarIdentifierGregorian
หรือปฏิทินอื่น ๆ NSString
ได้รับอนุญาตให้i_anotherTimeZone
สามารถซื้อได้ด้วย[NSTimeZone knownTimeZoneNames]
แต่anotherCalendar.timeZone
อาจจะ[NSTimeZone defaultTimeZone]
หรือ[NSTimeZone localTimeZone]
หรือ[NSTimeZone systemTimeZone]
ทั้งหมด
มันanotherComponents
ถือเวลาในเขตเวลาใหม่ คุณจะสังเกตanotherDate
ได้ว่าเท่ากับi_date
เพราะถือเวลาใน GMT (UTC)
คุณสามารถลองอันนี้:
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);
แปลงเวลา UTC เป็นโซนเวลาปัจจุบัน
ฟังก์ชั่นการโทร
NSLocale *locale = [NSLocale autoupdatingCurrentLocale];
NSString *myLanguageCode = [locale objectForKey: NSLocaleLanguageCode];
NSString *myCountryCode = [locale objectForKey: NSLocaleCountryCode];
NSString *rfc3339DateTimeString = @"2015-02-15 00:00:00"];
NSDate *myDateTime = (NSDate*)[_myCommonFunctions _ConvertUTCTimeToLocalTimeWithFormat:rfc3339DateTimeString LanguageCode:myLanguageCode CountryCode:myCountryCode Formated:NO];
ฟังก์ชัน
-NSObject*)_ConvertUTCTimeToLocalTimeWithFormat:rfc3339DateTimeString LanguageCode:(NSString *)lgc CountryCode:(NSString *)ctc Formated:(BOOL) formated
{
NSDateFormatter *sUserVisibleDateFormatter = nil;
NSDateFormatter *sRFC3339DateFormatter = nil;
NSTimeZone *timeZone = [NSTimeZone defaultTimeZone];
if (sRFC3339DateFormatter == nil)
{
sRFC3339DateFormatter = [[NSDateFormatter alloc] init];
NSLocale *myPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:[NSString stringWithFormat:@"%@", timeZone]];
[sRFC3339DateFormatter setLocale:myPOSIXLocale];
[sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
[sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
}
// Convert the RFC 3339 date time string to an NSDate.
NSDate *date = [sRFC3339DateFormatter dateFromString:rfc3339DateTimeString];
if (formated == YES)
{
NSString *userVisibleDateTimeString;
if (date != nil)
{
if (sUserVisibleDateFormatter == nil)
{
sUserVisibleDateFormatter = [[NSDateFormatter alloc] init];
[sUserVisibleDateFormatter setDateStyle:NSDateFormatterMediumStyle];
[sUserVisibleDateFormatter setTimeStyle:NSDateFormatterShortStyle];
}
// Convert the date object to a user-visible date string.
userVisibleDateTimeString = [sUserVisibleDateFormatter stringFromDate:date];
return (NSObject*)userVisibleDateTimeString;
}
}
return (NSObject*)date;
}