2016-12-07 13 views
0

に私は日付フォーマットのためのいくつかの値("dd-MM-yyyy")をテストしていると私は説明できない特殊なケースがありますnilを返します。iOSの - NSDateFormatter dateFromStringが一つだけの場合

var datef = NSDateFormatter() 
datef.dateFormat = "dd-MM-yyyy"; 
var date_a = "02-01-1990" 
var date_b = "01-01-1990" 
var date_f_a = datef.dateFromString(date_a); 
var date_f_b = datef.dateFromString(date_b); 

data_f_aは1月2日を返します1990年12月12日、date_f_bはnilを返します。

datef.lenient = trueを追加した場合、date_f_bはもはやnilではありませんが、その必要はありません。なぜそれは無効な日付ですか?

EDIT 1: 私はを使用する場合、それは同じことを起こる:

Using Swift version 3

EDIT 2: Xcodeのバージョン:Xcodeの7.3 については8.1

+0

NSDateFormatter..iの代わりにDateFormatterを使用すると、正常に動作します.iはdate_f_bのnilを取得しませんでした。 –

+0

質問に使用しているxCodeバージョンを追加してください –

+0

あなたのロケールとタイムゾーンは? – rmaddy

答えて

2

は、いくつかのコメントの後、それは問題のコードはes_PEのロケールで実行されていることが確認されているでしょう。これはペルーの国です。問題の日付は1990年1月1日です。デフォルトでは、NSDateFormatterはローカルのタイムゾーンを使用し、時間のない日付文字列を解析する場合は深夜が仮定されます。

ペルーでは、1990年1月1日の深夜0時から軽い節約が始まりました。これは、1989年12月31日の午後11時59分59秒から1990年1月1日:00am。

これは、このユーザーのために文字列01-01-1990を変換しようとする試みが失敗した理由の1つです。この日の真夜中はペルーではありませんでした(もしあれば、同じ日に昼間の節約を開始した他のロケールもあります)。このコードをテストするほとんどの人は、このコードをテストするほとんどの人がペルーに住んでいないので、うまく動作すると主張します。

有用な情報がある便利なウェブサイトが見つかりました。ペルーと昼間の節約時間の詳細については、http://www.timeanddate.com/time/change/peru/lima?year=1990を参照してください。 1989年と1991年に、ペルーは昼間の節約の時間を使用しなかったことに注意してください。

+0

はい、何が起こっていたかについての素晴らしい説明です。 –

+0

ありがとうございます。喜んで助けてください。あなたが受け入れた答えは実際には問題を説明するために全く試みません。より良い答えが出てきたら、あなたが受け入れる答えを変えることは、まったく問題ないことに注意してください。 – rmaddy

0

あなたが使用する必要がありますがNSDateComponents

var datef = NSDateFormatter() 
datef.dateFormat = "dd-MM-yyyy"; 

var dtCompo = NSDateComponents() 
dtCompo.day = 2 
dtCompo.month = 1 
dtCompo.year = 1990 
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
var date_f_a = cal.dateFromComponents(dtCompo) 

dtCompo = NSDateComponents() 
dtCompo.day = 1 
dtCompo.month = 1 
dtCompo.year = 1990 
var date_f_b = cal.dateFromComponents(dtCompo) 

var date_f_a_string = datef.stringFromDate(date_f_a!) 
var date_f_b_string = datef.stringFromDate(date_f_b!) 

print(date_f_a_string) 
print(date_f_b_string) 

出力は以下となります enter image description here のXcode 8.1

var datef = DateFormatter() 
datef.dateFormat = "dd-MM-yyyy"; 

var dtCompo = DateComponents() 
dtCompo.day = 2 
dtCompo.month = 1 
dtCompo.year = 1990 
let cal = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)! 
var date_f_a = cal.date(from: dtCompo) 

dtCompo = DateComponents() 
dtCompo.day = 1 
dtCompo.month = 1 
dtCompo.year = 1990 
var date_f_b = cal.date(from: dtCompo) 

var date_f_a_string = datef.string(from: date_f_a!) 
var date_f_b_string = datef.string(from: date_f_b!) 

print(date_f_a_string) 
print(date_f_b_string) 

出力が enter image description here

+0

私はSwiftバージョン(2.2)のためにNSDateFormatterを使用しています。 –

+0

最新のバージョンでは、私は同じ問題を抱えています –

+0

私は2つのxCodeを持っていて、私は更新された回答ごとに適切な出力を与えます –

関連する問題