2017-02-22 7 views
2

저는 Swift 3에 내 응용 프로그램의 코드를 마이 그 레이션했으며 Swift 2 또는 그 이전 버전에서는 얻지 못했던 DateFormatter (이전의 NSDateFormatter)에서이 문제가 발생했습니다.Swift에서 DateFormatter의 시간대를 변경할 수 없습니다.

문제는, 내가 Date 객체에 문자열을 변환해야하고 그렇게 할 내 코드가 뭔가 같은 점이다

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let dateStr1 = "2017-02-22" 
let date1 = dateFormatter.date(from: dateStr1) 

지금이 잘 작동하고 엑스 코드의 놀이터에서 예상대로하지만 난하려고 할 때 내 응용 프로그램에서 실행, 날짜 1 2017-02-21 13:00:00 +0000 즉 과거의 날짜와 나는 1 일 2017-02-22 fyi 수 있어야합니다, 나는 호주에 오전 이 개발을하고 있습니다.

내 응용 프로그램의 UI에서 날짜 문자열을 가져오고 있으며 UI에서 2017-02-22이므로 Swift의 Date (또는 NSDate) 객체에 해당 문자열을 숨겨야합니다.

나는 운의 DateFormatter의 타임 존 및 로케일을 설정

dateFormatter.timeZone = TimeZone(identifier: TimeZone.current.identifier) 

dateFormatter.locale = Locale.init(identifier: Locale.current.identifier) 

을 시도하지하지만 여전히있다?

나는 또한 같은 달력 구성 요소에서 날짜를 만드는 시도

,

var dateComponents = DateComponents() 
var day = "22" 
var month = "02" 
var year = "2017" 
dateComponents.day = Int(day)! 
dateComponents.year = Int(year)! 
print(TimeZone.current) 
dateComponents.timeZone = TimeZone.current 
dateComponents.month = Int(month)! 
let userCalendar = Calendar.current 
let date1 = userCalendar.date(from: dateComponents) 

그러나 아직도 일부 살펴 보았다 2017년 2월 21일 대신 2017년 2월 22일의 점점 즉 올바른 날짜를받지 구약 사이

How do you create a swift Date object

Converting date between timezones swift

같은 다른 SO 질문 그녀. 내가 원하는 결과를 얻을 수있는 방법에 대한 아이디어? 이 코드는 Swift 이전에는 완전히 정상적으로 작동했습니다.

+0

질문에 처음 4 줄의 코드에 문제가 있다고 생각하는 이유는 무엇입니까? 괜찮아요. – rmaddy

+1

호주 2 월 22 일 자정은 21 일 (UTC) 13시입니다. 아무 문제가 없습니다. – rmaddy

+0

충분히 공정하게! 문제를보다 분명하게하기 위해 질문을 편집했습니다. – cptdanko

답변

1

maddy가 의견에서 지적했듯이 Xcode는 Universal Timezone - UTZ (그리니치 의미라고도 함)의 "원시 형식"으로 날짜를 표시합니다.

다른 시간대에 표시된 날짜를 얻으려면 다시 DateFormatter를 사용해야합니다. 그러므로 내가 변환 (22) 2 월을 -

Print screen of code in playground with output.

내가 퍼스, 웨스턴 오스트레일리아에서이 코드를 실행하는거야 (즉 UTZ + 8) :

그래서 :

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let dateStr1 = "2017-02-22" 
let date1: Date = dateFormatter.date(from: dateStr1)! 

print("\(date1)") 
print("\(dateFormatter.string(from: date1))") 

당신에게 제공합니다 -2017을 2017 년 2 월 21 일 UTZ로 저장 한 날짜로 변환하지만, 내 로캘의 DateFormatter로 다시 표시하면 2017 년 2 월 22 일 자정이됩니다.