মনে হচ্ছে NSDateFormatter
এটির একটি "বৈশিষ্ট্য" রয়েছে যা আপনাকে অপ্রত্যাশিতভাবে কামড়ায়: যদি আপনি একটি সাধারণ "স্থির" ফর্ম্যাট অপারেশন করেন যেমন:
NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"yyyyMMddHHmmss"];
NSString* dateStr = [fmt stringFromDate:someDate];
[fmt release];
তারপরে এটি মার্কিন যুক্তরাষ্ট্রে কাজ করে এবং বেশিরভাগ লোকালগুলি UNTIL এর মধ্যে ... 24 ঘন্টা অঞ্চলে তাদের ফোনের সাথে সেট করে কেউ 12/24 ঘন্টাটির সেটিংসে 12 এ সেট করে Then তারপরে উপরের অংশটি "এএম" বা "প্রধানমন্ত্রী" এর দিকে নজর দেওয়া শুরু করে ফলাফলের স্ট্রিংয়ের সমাপ্তি।
(উদাহরণস্বরূপ, এনএসডিট ফরমেটার, আমি কি কিছু ভুল করছি বা এটি কোনও বাগ? )
(এবং https://developer.apple.com/library/content/qa/qa1480/_index.html দেখুন )
স্পষ্টতই অ্যাপল এটিকে "বিএডি" হিসাবে ঘোষণা করেছে - ব্রোকেন অ্যাস ডিজাইনড, এবং তারা এটি ঠিক করতে যাচ্ছেন না।
স্পষ্টতই স্পষ্টতই একটি নির্দিষ্ট অঞ্চলের জন্য সাধারণত তারিখের বিন্যাসের স্থানীয় অবস্থান নির্ধারণ করা হয়, সাধারণত মার্কিন যুক্তরাষ্ট্র, তবে এটি কিছুটা অগোছালো:
NSLocale *loc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[df setLocale: loc];
[loc release];
অনসি-টোভিসে খুব খারাপ নয়, তবে আমি প্রায় দশটি ভিন্ন অ্যাপ্লিকেশন নিয়ে কাজ করছি এবং প্রথমটিতে আমি যা দেখছি তাতে এই দৃশ্যের 43 টি উদাহরণ রয়েছে।
সুতরাং কোনও ম্যাক্রো / ওভাররাইড শ্রেণীর জন্য কোনও চতুর ধারণা / কোডটি অস্পষ্ট করে না রেখে, সমস্ত কিছু পরিবর্তনের প্রচেষ্টাটিকে হ্রাস করতে হবে? (আমার প্রথম প্রবৃত্তিটি এনএসডিটফর্ম্যাটরটি এমন সংস্করণ দিয়ে ওভাররাইড করা যা init পদ্ধতিতে লোকেল সেট করে। দুটি লাইন পরিবর্তন করতে হবে - বরাদ্দ / আরআর লাইন এবং যুক্ত আমদানি))
যোগ করা হয়েছে
আমি এ পর্যন্ত এটি নিয়ে এসেছি - সমস্ত পরিস্থিতিতে কাজ করে বলে মনে হচ্ছে:
@implementation BNSDateFormatter
-(id)init {
static NSLocale* en_US_POSIX = nil;
NSDateFormatter* me = [super init];
if (en_US_POSIX == nil) {
en_US_POSIX = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
}
[me setLocale:en_US_POSIX];
return me;
}
@end
অনুগ্রহ!
আমি মধ্য-দিন মঙ্গলবারের মধ্যে আমি দেখি সেরা (বৈধ) পরামর্শ / সমালোচনার প্রতি অনুদান দেব। [নীচে দেখুন - সময়সীমা বাড়ানো হয়েছে]]
হালনাগাদ
পুনরায় ওএমজেডের প্রস্তাব, আমি যা খুঁজেছি তা এখানে -
এখানে বিভাগ সংস্করণ - এইচ ফাইল:
#import <Foundation/Foundation.h>
@interface NSDateFormatter (Locale)
- (id)initWithSafeLocale;
@end
বিভাগ এম ফাইল:
#import "NSDateFormatter+Locale.h"
@implementation NSDateFormatter (Locale)
- (id)initWithSafeLocale {
static NSLocale* en_US_POSIX = nil;
self = [super init];
if (en_US_POSIX == nil) {
en_US_POSIX = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
}
NSLog(@"Category's locale: %@ %@", en_US_POSIX.description, [en_US_POSIX localeIdentifier]);
[self setLocale:en_US_POSIX];
return self;
}
@end
কোড:
NSDateFormatter* fmt;
NSString* dateString;
NSDate* date1;
NSDate* date2;
NSDate* date3;
NSDate* date4;
fmt = [[NSDateFormatter alloc] initWithSafeLocale];
[fmt setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
dateString = [fmt stringFromDate:[NSDate date]];
NSLog(@"dateString = %@", dateString);
date1 = [fmt dateFromString:@"2001-05-05 12:34:56"];
NSLog(@"date1 = %@", date1.description);
date2 = [fmt dateFromString:@"2001-05-05 22:34:56"];
NSLog(@"date2 = %@", date2.description);
date3 = [fmt dateFromString:@"2001-05-05 12:34:56PM"];
NSLog(@"date3 = %@", date3.description);
date4 = [fmt dateFromString:@"2001-05-05 12:34:56 PM"];
NSLog(@"date4 = %@", date4.description);
[fmt release];
fmt = [[BNSDateFormatter alloc] init];
[fmt setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
dateString = [fmt stringFromDate:[NSDate date]];
NSLog(@"dateString = %@", dateString);
date1 = [fmt dateFromString:@"2001-05-05 12:34:56"];
NSLog(@"date1 = %@", date1.description);
date2 = [fmt dateFromString:@"2001-05-05 22:34:56"];
NSLog(@"date2 = %@", date2.description);
date3 = [fmt dateFromString:@"2001-05-05 12:34:56PM"];
NSLog(@"date3 = %@", date3.description);
date4 = [fmt dateFromString:@"2001-05-05 12:34:56 PM"];
NSLog(@"date4 = %@", date4.description);
[fmt release];
ফলাফল:
2011-07-11 17:44:43.243 DemoApp[160:307] Category's locale: <__NSCFLocale: 0x11a820> en_US_POSIX
2011-07-11 17:44:43.257 DemoApp[160:307] dateString = 2011-07-11 05:44:43 PM
2011-07-11 17:44:43.264 DemoApp[160:307] date1 = (null)
2011-07-11 17:44:43.272 DemoApp[160:307] date2 = (null)
2011-07-11 17:44:43.280 DemoApp[160:307] date3 = (null)
2011-07-11 17:44:43.298 DemoApp[160:307] date4 = 2001-05-05 05:34:56 PM +0000
2011-07-11 17:44:43.311 DemoApp[160:307] Extended class's locale: <__NSCFLocale: 0x11a820> en_US_POSIX
2011-07-11 17:44:43.336 DemoApp[160:307] dateString = 2011-07-11 17:44:43
2011-07-11 17:44:43.352 DemoApp[160:307] date1 = 2001-05-05 05:34:56 PM +0000
2011-07-11 17:44:43.369 DemoApp[160:307] date2 = 2001-05-06 03:34:56 AM +0000
2011-07-11 17:44:43.380 DemoApp[160:307] date3 = (null)
2011-07-11 17:44:43.392 DemoApp[160:307] date4 = (null)
ফোনটি [একটি আইপড টাচ] গ্রেট ব্রিটেনে সেট করা আছে, 12/24 স্যুইচটি 12 এ সেট করা আছে the দুটি ফলাফলের মধ্যে একটি স্পষ্ট পার্থক্য রয়েছে এবং আমি বিভাগের সংস্করণটিকে ভুল বলে বিচার করি। নোট করুন যে বিভাগের সংস্করণে লগটি কার্যকর হচ্ছে (এবং কোডে রাখা স্টপগুলি আঘাত হানে), সুতরাং এটি কোনওভাবেই কোডটি ব্যবহার না হওয়ার ঘটনা নয়।
অনুদানের আপডেট:
যেহেতু আমি এখনও কোনও প্রযোজ্য উত্তর পাইনি তবে আমি বা দু'দিনের জন্য অনুগ্রহের সময়সীমা বাড়িয়ে দেব।
অনুগ্রহটি ২১ ঘন্টার মধ্যে শেষ হয় - যে কেউ আমার পক্ষে সবচেয়ে বেশি চেষ্টা করে সাহায্য করবে, এমনকি উত্তরটি আমার ক্ষেত্রে কার্যকর না হলেও।
একটি কৌতূহলী পর্যবেক্ষণ
বিভাগ বাস্তবায়ন সামান্য পরিবর্তিত:
#import "NSDateFormatter+Locale.h"
@implementation NSDateFormatter (Locale)
- (id)initWithSafeLocale {
static NSLocale* en_US_POSIX2 = nil;
self = [super init];
if (en_US_POSIX2 == nil) {
en_US_POSIX2 = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
}
NSLog(@"Category's locale: %@ %@", en_US_POSIX2.description, [en_US_POSIX2 localeIdentifier]);
[self setLocale:en_US_POSIX2];
NSLog(@"Category's object: %@ and object's locale: %@ %@", self.description, self.locale.description, [self.locale localeIdentifier]);
return self;
}
@end
মূলত কেবল স্ট্যাটিক লোকেলের ভেরিয়েবলের নাম পরিবর্তন করা হয়েছে (সাবক্লাসে ঘোষিত স্ট্যাটিকের সাথে কিছুটা বিরোধ দেখা দিলে) এবং অতিরিক্ত এনএসএলগ যুক্ত করেছে। তবে দেখুন কী সেই এনএসএলগ প্রিন্ট করে:
2011-07-15 16:35:24.322 DemoApp[214:307] Category's locale: <__NSCFLocale: 0x160550> en_US_POSIX
2011-07-15 16:35:24.338 DemoApp[214:307] Category's object: <NSDateFormatter: 0x160d90> and object's locale: <__NSCFLocale: 0x12be70> en_GB
2011-07-15 16:35:24.345 DemoApp[214:307] dateString = 2011-07-15 04:35:24 PM
2011-07-15 16:35:24.370 DemoApp[214:307] date1 = (null)
2011-07-15 16:35:24.378 DemoApp[214:307] date2 = (null)
2011-07-15 16:35:24.390 DemoApp[214:307] date3 = (null)
2011-07-15 16:35:24.404 DemoApp[214:307] date4 = 2001-05-05 05:34:56 PM +0000
আপনি দেখতে পাচ্ছেন, সেটলোকলটি সহজভাবে করেন নি। বিন্যাসটির লোকেল এখনও en_GB। এটি প্রদর্শিত হয় যে কোনও বিভাগে একটি init পদ্ধতি সম্পর্কে কিছু "অদ্ভুত" রয়েছে।
চূড়ান্ত উত্তর
দেখুন গৃহীত উত্তর নিচে।
- (NSDateFormatterBehavior)formatterBehavior
?