আইওএস: ইউটিসি এনএসডিটকে স্থানীয় সময় অঞ্চলে রূপান্তর করুন


139

আমি কীভাবে NSDateকোনও ইউটিসিকে স্থানীয় সময় অঞ্চল এনএসডিটকে উদ্দেশ্য সি বা / এবং সুইফটে রূপান্তর করব ?


14
তারিখ অবশ্যই সময় অঞ্চল আছে।
গ্লেন মেইনার্ড

1
এটি যদি সহায়তা করে তবে তাপমাত্রার কথা চিন্তা করুন। এগুলি ফারেনহাইট, সেলসিয়াস বা কেলভিনে প্রকাশ করা যেতে পারে। তবে প্রকাশিত তথ্যের (অণুগুলির গড় গতিবিধি) কোনও অন্তর্নিহিত ইউনিট নেই, যদিও এটি কোনও ইউনিটে প্রকাশিত হলে কেবল আমাদের কাছে তাৎপর্যপূর্ণ।
সফটওয়্যারটি

7
@ ডেভিডলং এনএসডেটের টাইমজোন রয়েছে। এনএসডিট শ্রেণির রেফারেন্স থেকে: "এই পদ্ধতিটি একটি নিখুঁত রেফারেন্স তারিখের সাথে তুলনামূলকভাবে একটি সময় মান দেয় - 1 জানুয়ারী 2001-এর প্রথম তাত্ক্ষণিক, জিএমটি।" GMT- এর স্পষ্ট এবং নির্দিষ্ট রেফারেন্সটি নোট করুন।
মারে সাগল

3
আমি একমত নই এনএসডেটের টাইমজোন নেই। এনএসডিটের জন্য সময় অঞ্চল নির্দিষ্ট করতে, আপনি একটি এনএসক্যালেন্ডার অবজেক্ট বা একটি এনএসডিট ফরমেটার অবজেক্ট ব্যবহার করুন। যদি আপনি কোনও স্ট্রিং থেকে কোনও এনএসডিট তৈরি করেন যার টাইমজোন নির্দিষ্ট নেই, তবে এনএসডিট ধরে নেবে যে স্ট্রিংটি জিএমটি সময়ে রয়েছে।
রিক্সার

1
@ মুর্যাসাগাল কেবল কারণ যে কোনও একটি নির্দিষ্ট পদ্ধতি নির্দিষ্ট সময় অঞ্চলে একটি তারিখের সাথে সম্পর্কিত সময় মূল্য দেয় it
এরিমিজিট

উত্তর:


139
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

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


সম্ভবত উল্লেখযোগ্যভাবে আপনি তারিখগুলি আবার স্ট্রিং থেকে আবার পড়তে ফর্ম্যাটর ব্যবহার করতে পারেন
slf

34
@ ডেভিডলং এটি ঠিক আছে যদি আপনি কেবল তারিখটি স্ট্রিং হিসাবে প্রদর্শন করছেন। তবে একটি তারিখে টাইম জোন রূপান্তর করার জন্য পুরোপুরি বৈধ কারণ রয়েছে। উদাহরণস্বরূপ, যদি আপনি সেটডেট ব্যবহার করে কোনও ইউআইডিটপিকারে তারিখটি ডিফল্ট করতে চান:। ওয়েব পরিষেবাদি দ্বারা ফিরিয়ে দেওয়া তারিখগুলি প্রায়শই ইউটিসি হয়, তবে ব্যবহারকারীর স্থানীয় সময় অঞ্চলে একটি টিভি প্রতিনিধির মতো প্রতিনিধিত্ব করে। একটি রূপান্তরিত তারিখে পাস করা পিকারে ভুল সময় প্রদর্শন করবে।
ক্রিস্টোফার পিক্সলে

5
@ GlennMaynard- এর সাথে আমি একমত নই এই উত্তরের NSDateসারমর্মটি হ'ল বস্তুর কোনও রূপান্তর প্রয়োজন নেই, যা সঠিক। তারিখটি ফর্ম্যাট করার সময় সময় অঞ্চলে রূপান্তর ঘটে, এটি তৈরি হওয়ার সময় নয়, কারণ তারিখের সময় অঞ্চল থাকে না।
ডেভ দেলং

1
@ গ্লেনমায়নার্ড ... ব্যতীত এটিকে বাদ দেওয়া NSCalendarDateহয়েছে।
ডেভ দেলং

1
এটিও নোট করুন: oleb.net/blog/2011/11/… যেখানে এটি "GMT! = UTC"
বলেছে

106

সম্পাদনা করুন যখন আমি এটি লিখেছিলাম তখন আমি জানতাম না যে আমার একটি ডেটফর্ম্টার ব্যবহার করা উচিত যা সম্ভবত আরও ভাল পদ্ধতির, সুতরাং এর উত্তরটিও পরীক্ষা করে দেখুন slf

আমার কাছে একটি ওয়েবসার্ভিস রয়েছে যা ইউটিসিতে তারিখগুলি ফেরত দেয়। আমি 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

25
এটি করবেন না। এনএসডিটস সর্বদা ইউটিসিতে থাকে। এটি কেবল বিষয়টি বিভ্রান্ত করে।
জেরেমিপ

13
এটি উপরে উল্লিখিত "ওয়েবসার্ভিস" কেসটির জন্য খুব কার্যকর হতে পারে। ধরা যাক আপনার কাছে এমন একটি সার্ভার রয়েছে যা ইউটিসিতে ইভেন্টগুলি সঞ্চয় করে এবং ক্লায়েন্টের আজ ঘটে যাওয়া সমস্ত ইভেন্টের জন্য জিজ্ঞাসা করতে চায়। এটি করার জন্য, ক্লায়েন্টকে বর্তমান তারিখটি (ইউটিসি / জিএমটি) পেতে হবে এবং তারপরে সার্ভারে প্রেরণের আগে এটির টাইমজোন অফসেটে স্থানান্তরিত করতে হবে।
টেলর লাফরিনে

@ জেরেমিপি এনএসডিটস সবসময় জিএমটিতে থাকে তা বলা আরও সঠিক হবে। এনএসডিট শ্রেণির রেফারেন্স থেকে: "এই পদ্ধতিটি একটি নিখুঁত রেফারেন্স তারিখের সাথে তুলনামূলকভাবে একটি সময় মান দেয় - 1 জানুয়ারী 2001-এর প্রথম তাত্ক্ষণিক, জিএমটি।" GMT- এর স্পষ্ট এবং নির্দিষ্ট রেফারেন্সটি নোট করুন। জিএমটি এবং ইউটিসির মধ্যে প্রযুক্তিগত পার্থক্য রয়েছে তবে বেশিরভাগ লোকেরা যে সমাধানগুলি সন্ধান করছেন সেগুলির ক্ষেত্রে এটি বেশিরভাগ অপ্রাসঙ্গিক।
মারে সাগল

3
আপনি কোথা থেকে কোডটি অনুলিপি করেছেন তা উল্লেখ করে ভাল লাগবে
আরিয়াক্ট

2
@ আর্য্যাক্স্ট আপনি ঠিক বলেছেন, আমি দুঃখিত আমি উত্তর পোস্ট করার সময় আমি কোথা থেকে অনুলিপি করেছি তা সততার সাথে মনে নেই।
gyozo kudor

49

আমি খুঁজে পাওয়া সবচেয়ে সহজ পদ্ধতিটি হ'ল:

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

3
এই উত্তরটি আরও বহনযোগ্য বলে মনে হচ্ছে। নীচের উত্তরটি ধরে নিয়েছে টাইমজোনটি রানটাইমের সময় ঠিক করা হয়েছে যখন উপরের উত্তরটি প্ল্যাটফর্ম থেকে সময় অঞ্চল নির্ধারণ করেছে।
bleeckerj

9
খুব উপকারী. একটি দিবস, secondsFromGMTForDateযদি আপনি দিবালোক সংরক্ষণের জন্য অ্যাকাউন্ট করতে চান তবে ব্যবহার করা উচিত। অ্যাপল ডক্স
সের্গেই মার্কেলভ

1
এটি ডিএসটি পরিবর্তনগুলি বিবেচনায় নিতে ব্যর্থ।
lkraider

36

সুইফট 3+ : ইউটিসি থেকে স্থানীয় এবং স্থানীয় থেকে ইউটিসি

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

এটি যে কোনও সময় অঞ্চলকে ইউটিসি বা বিপরীতে রূপান্তর করবে?
মিতেশ

26

আপনি যদি স্থানীয় তারিখ এবং সময় চান। এই কোডটি ব্যবহার করে দেখুন: -

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

দুর্দান্ত উত্তর! এটি বর্তমান তারিখটি দখল করবে। এটির সাথে অভিযোজন যা ডেট স্ট্রিং ব্যবহার করে তা প্রতিস্থাপন [NSDate date]করা হবে [NSDate dateWithNaturalLanguageString:sMyDateString]
ভলমিকে

7

আপনার ইউটিসি তারিখটিকে স্থানীয় তারিখে রূপান্তর করুন

-(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"];

1
আমার জন্য কাজ করছে না, আমার স্থানীয় সময়টি +3 এবং এই কোডটি +2
ফাদি আবুজান্ট

6

এখানে ইনপুটটি একটি স্ট্রিং কার্টিউটটাইম (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;

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


2

তারিখের সময়টিকে আমাদের লোকালটাইমজোনতে রূপান্তর করতে আমি এই পদ্ধতিটি লিখি

এখানে (এনএসএসআরটিং *) টাইমজোন প্যারামিটার একটি সার্ভার টাইমজোন

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

1

যেহেতু কেউ ব্যবহার করছে বলে মনে হচ্ছে না 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) এ সময় রাখে।


0

আপনি এটি চেষ্টা করতে পারেন:

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

-1

ইউটিসি সময়কে বর্তমান সময়ের জোনে রূপান্তর করুন।

কল ফাংশন

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.