2017-05-26 175 views
2

我想將日期字符串格式化爲NSDate對象,這聽起來不是什麼大事。將.000Z格式的日期字符串格式化爲NSDate

問題是,日期字符串在時區值中包含一個點而不是加號或其他內容。一個日期如下:

2017-06-04T16:00:00.000Z 

我試圖格式字符串像

yyyy-MM-dd'T'HH:mm:ss.ZZZZ 
yyyy-MM-dd'T'HH:mm:ss.ZZZ 
yyyy-MM-dd'T'HH:mm:ss.Z 

當然我也檢查了它的nsdateformatter.com,這工作,但在Xcode中的NSDate始終是零。

+0

'YYYY-MM-dd'T'HH:MM:ss.SSS'Z'' ?? – Larme

+1

@Larme不要引用'Z'。這是時區。當您引用該字符串時,除非在日期格式化程序中設置了特定的時區,否則該字符串會在本地時間進行解釋。如果不引用'Z',則不需要在格式化程序上設置特定的時區,並且字符串得到正確解釋。 – rmaddy

回答

4

這項工作對我來說

var str = "2017-06-04T16:00:00.000Z" 
let formato = DateFormatter() 
formato.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
formato.timeZone = NSTimeZone(name: "UTC")! as TimeZone 
formato.formatterBehavior = .default 
var data = formato.date(from: str) 
+0

沒有必要在格式化程序上設置時區。被解析的日期字符串中的「Z」告訴日期格式化程序字符串表示什麼時區。 – rmaddy

-1

我面對的總是讓尼爾斯&作爲解決同樣的問題,您可以消除.ZZZZ部分從日期字符串

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) 

let dateString = openningTimeString.components(separatedBy: ".")[0] 

let myDate = dateFormatter.date(from: dateString) 
+0

自己分手原始日期字符串的更好的解決方案是簡單地使用適當的日期格式。 – rmaddy

2

在Objective-C

NSString *strValue = @"2017-06-04T16:00:00.000Z"; 
NSString *dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 

// Or this if you like get in local time 
NSString *dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 

NSDateFormatter *dateFmtr = [[NSDateFormatter alloc] init]; 
[dateFmtr setDateFormat: dateFormat]; 

// You get a NSDate object 
NSDate *dateValue = [dateFmtr dateFromString: strValue]; 

// Or NSString object 
NSString *dateValue = [dateFmtr stringFromDate: dateValue]; 

不同字符串格式的其他變體。

// 2018-02-28T16:38:33.6873197-05:00 
// If you have this string format you can use 
NSString *strDate1 = @"yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"; 

對於具有複雜格式的更多信息,你可以看到模式 Date Format Patterns和蘋果的官方文檔Preset Date and Time StylesDate Formatters