2017-05-26 458 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