2013-08-12 18 views
8

Makinemde (bölgesel ayarlar Amerika Birleşik Devletleri), varsayılan "kısa" tarih biçimi "1/5/13" (ay/gün/yıl) olarak ayarlanmıştır.Hafta numaralarını içeren NSDateFormatter sorunu

Sistem Tercihlerinde, bir haftalık numaraya "1/5/13 1" ekledim. Benim makinede

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"]; 
NSLog(@"Date: %@", date); 

, bu baskılar: değil , var

Date: 2000-01-01 05:00:00 +0000 

Benim sorunum bir tarihe bir dize dönüştürmek için deneyin bu koddur 'a bile yakındır.

Bu sorun neden oluyor?

+0

neden bu sayıyı siz eklersiniz? Onu almak için nsdateformatter kullanın. btw: '-dateFromString:' öğesini kullanmalısınız. Bence doktora danışmalısın. http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html – vikingosegundo

+0

@vikingosegundo "dateFromString:" işlevini kullanacak kodu değiştirdim, sonuç aynı.Mesele şu ki, bu haftaki sayıyı eklemiyorum :) Buradaki nokta, ** kullanıcılarımın bu hafta numarasını Sistem Tercihleri'ne eklediler ve uygulamam doğru bir tarihe çevirmiyor. –

+0

Aynı şeyi sistem tercihlerinde de yaptım ve sonra kısa bir stil tarihi biçimlendirici ayarladıktan sonra 'NSString * dateString = [biçimlendirici stringFromDate: [NDate date]]; NSDate * parsedDate = [formatter dateFromSTring: dateString]; 've aynı sorunu gördü. 'dateString' tercihlerime göre biçimlendi, ancak biçimlendirici aynı dizeyi doğru şekilde ayrıştırmayacaktı! Aynı stile sahip olan stillere ve diğer stillere ve CFDateFormatter'a başka değişiklikler denedim! Belki de bir çerçeve hatası mı? –

cevap

8

Bu tartışmaya geç kaldım ve bir çok çözüm önerdim, ancak onlarla yanlış gördüğüm şey iki uyumsuz tarih biçimi öğesinin birlikte kullanılmasıdır. Orijinal yaklaşımınız, tarihinizi almaya çalıştığınız dize, NSDateFormatterShortStyle'un sağladığı özelliklerle eşleşmediğinden başarısız oldu.

Yılın haftasını değerlendirecek olursanız, yılın büyük harfini kullanmanız gerekir; Bu "Yıl Haftası" tür takvim sağlar.

edelim yeni biçimi eklemek için orijinal kod biraz yeniden çalışır: Ben yıl için büyük harfli formu kullanıyorum

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/YY w"]; 
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"]; 
NSLog(@"Date: %@", date); 

Not. Yılın hafta 1 ile, bu alın:

Date: 2013-01-05 08:00:00 +0000 

ve 2 yıl hafta:

Date: 2013-01-12 08:00:00 +0000 

ve 3 ile:

Date: 2013-01-19 08:00:00 +0000 

mantıklı değil mi? Tarih içindeki gün, her bir artışla birlikte yedi güne kadar, yılın haftasından biriyle artar. Zaman dedik, tabi ki, ama o bölgede değerlendirmek için hiçbir şeyi tartışmamıştık, değil mi?

+1

+ 1 bu nasıl yapacağımı oldukça fazla. Ancak, biçimlendiricinin 'locale 'özelliğini, ayrıştırdığınız dizede belirtilen tarihe göre yerel olarak ayarlayarak, farklı yerel konumları dikkate aldığınızdan emin olun. Bu, eğer (örneğin) 2013 yılında 500 yıldan fazla bir zaman önce, Tayland'da olsaydım, tamamen başarısız olur. Genellikle, yerel ayarı "en_US_POSIX" olarak ayarlamak, bilgisayar tarafından oluşturulan tarih dizeleri için iyi çalışır. –

+0

"Özgün yaklaşımınız, tarihinizi almaya çalıştığınız dizge, NSDateFormatterShortStyle'ın sağladığı özelliklerle eşleşmediğinden başarısız oldu." Bu iddiayı daha ayrıntılı olarak açıklayabilir misiniz? –

+0

@CarlVeazey ShortStyle, herhangi bir sayıda varyasyon olabilir (çünkü kullanıcı OS X'de değiştirilebilecektir) ve aynı zamanda hafta numarasını da içermez. –

-1

Sen sonra ihtiyaca dayalı NSCalendar ve NSDateComponents kullanmak hafta numarası ile oynamak istiyorsanız (bu kod parçacığını bakın) ... NSDateFormatter ait dateFromString yöntemi ...

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"mm/dd/yyyy"]; 
NSDate *myDate = [dateFormatter dateFromString:@"1/5/2013"]; 
NSLog(@"Date: %@", myDate); 

kullanmak gerekir

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:date]; 
NSInteger week = [components week]; 

Umarım bu yardımcı olur.

2
NSDateComponents *cmp=[[[NSDateComponents alloc]init]autorelease]; 
[cmp setWeek:1]; 
NSCalendar *cal=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSDate *dte=[NSDate date]; 
NSDate *weekDate=[cal dateByAddingComponents:cmp toDate:dte options:0]; 
[dateFormatter setDateFormat:@"MM/dd/YY"]; 
NSString *strDate=[dateFormatter stringFromDate:weekDate]; 
NSLog(@"Date: %@", strDate);