如何将任何日期格式转换为一种日期格式,即ddMMMMYYYY(10Apr2018)

我从谷歌服务器获得不同类型的日期格式。 为方便起见,我希望将所有这些日期格式转换为一种格式。 以下是我得到回应的不同日期。

17 Jun 14 12:26:20 Tue, 6 Mar 2018 05:16:51 8 Dec 2014 13:41:09 +0000 16 Sep 2014 16:08:47 -0400 29 Oct 2014 20:12:33 +0530 Tue, 8 Jul 2014 11:48:53 -0700 Tue, 03 Jun 2014 08:35:05 GMT Tue, 03 Jun 2014 10:59:00 GMT Wed, 04 Jun 2014 12:26:52 GMT Wed, 7 Mar 2018 17:44:11 +0530 Wed, 07 Mar 2018 11:29:00 +0530 Thu, 8 May 2014 12:06:27 +0300 (EAT) Tue, 13 Mar 2018 12:01:19 +0000 (UTC) Mon, 19 Mar 2018 04:24:34 -0700 (PDT) Sat, 24 May 2014 11:31:57 +0200 (CEST) Wed, 02 Apr 2014 23:39:15 +0500 (GMT+05:00) 

如何将所有日期字符串转换为此格式2015-09-07 05:42:23 +0000。 提前致谢。

我试过下面它的工作正常,但是对于这个日期它由于应用程序中的崩溃而重新启动Nil – >星期二,2015年9月8日11:28:17 +0580。 它返回零。

  struct RegexFormat { let pattern : String let dateFormat : String } let dateFormatter : DateFormatter = { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }() let regexFormats = [RegexFormat(pattern:"\\w{3},\\s+\\d{1,2}\\s+\\w{3}\\s+\\d{4}\\s+\\d{1,2}:\\d{2}:\\d{2}\\s+[+-]\\d{4}", dateFormat:"E, dd MMM yyyy HH:mm:ss Z"), RegexFormat(pattern:"\\w{3},\\s+\\d{1,2}\\s+\\w{3}\\s+\\d{4}\\s+\\d{1,2}:\\d{2}:\\d{2}\\s+\\w{3}", dateFormat:"E, dd MMM yyyy HH:mm:ss z"), RegexFormat(pattern:"\\d{1,2}\\s+\\w{3}\\s+\\d{4}\\s+\\d{1,2}:\\d{2}:\\d{2}\\s+[+-]\\d{4}", dateFormat:"d MMM yyyy HH:mm:ss Z"), RegexFormat(pattern:"\\d{1,2}\\s+\\w{3}\\s+\\d{2,4}\\s+\\d{1,2}:\\d{2}:\\d{2}", dateFormat:"dd MM yy HH:mm:ss")] func dateConverterFromStringtoDate(from string : String) -> Date? { for regexFormat in regexFormats { do { let regex = try NSRegularExpression(pattern: regexFormat.pattern) if let match = regex.firstMatch(in: string, range: NSRange(location: 0, length: string.utf16.count)) { let dateRange = Range(match.range, in: string)! dateFormatter.dateFormat = regexFormat.dateFormat return dateFormatter.date(from: String(string[dateRange]) ) } } catch { continue } } return nil } 

我想将所有日期转换为此格式。 2015-09-08 05:42:07 +0000

@vadian请为上述问题提出建议。

你可以试试这个:

如果响应是字符串格式,有两种不同的日期格式:

  var dateStr = "\(element.value!)" var isWeekThere:Bool = false if dateStr.range(of:"Mon") != nil { isWeekThere = true }else if dateStr.range(of:"Tue") != nil { isWeekThere = true }else if dateStr.range(of:"Wed") != nil { isWeekThere = true }else if dateStr.range(of:"Thu") != nil { isWeekThere = true }else if dateStr.range(of:"Fri") != nil { isWeekThere = true }else if dateStr.range(of:"Sat") != nil { isWeekThere = true }else if dateStr.range(of:"Sun") != nil { isWeekThere = true } var format:String = String() dateStr = dateStr.replacingOccurrences(of: "\\s?\\(\\w+\\)", with: "", options: .regularExpression) let dateFormatter = DateFormatter() if isWeekThere == true{ format = "E, d MMM yyyy HH:mm:ss Z" }else{ format = "d MMM yyyy HH:mm:ss Z" } dateFormatter.dateFormat = format let date = dateFormatter.date(from: dateStr) print(date!) dateFormatter.dateFormat = "ddMMMMYYYY" // Any format you can pass here let convDate = dateFormatter.string(from: date!) print(convDate) 

这是输出

在此处输入图像描述

编辑

如果它以一些不均匀的格式获得崩溃:

您可以使用

 dateFormatter.dateFormat = "ddMMMMyyyy" 

谢谢@vadian的建议

如果响应是日期格式,请编辑

然后像这样使用:

 let date = element.value! //Your response in date print(date!) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "ddMMMMYYYY" // Any format you can pass here let convDate = dateFormatter.string(from: date!) print(convDate) 

到目前为止,答案主要集中在获取与DateFormatter一起使用的正确格式字符串,因为日期字符串有很多不同的格式,所以它有其限制。

我提出了另一种方法:使用NSDataDetectorNSDataDetector的子类)。 这与Apple用于突出显示电子邮件中的日期或电话号码以启用用户交互的class级相同。

 let dateStrings = """ 17 Jun 14 12:26:20 Tue, 6 Mar 2018 05:16:51 8 Dec 2014 13:41:09 +0000 16 Sep 2014 16:08:47 -0400 29 Oct 2014 20:12:33 +0530 Tue, 8 Jul 2014 11:48:53 -0700 Tue, 03 Jun 2014 08:35:05 GMT Tue, 03 Jun 2014 10:59:00 GMT Wed, 04 Jun 2014 12:26:52 GMT Wed, 7 Mar 2018 17:44:11 +0530 Wed, 07 Mar 2018 11:29:00 +0530 Thu, 8 May 2014 12:06:27 +0300 (EAT) Tue, 13 Mar 2018 12:01:19 +0000 (UTC) Mon, 19 Mar 2018 04:24:34 -0700 (PDT) Sat, 24 May 2014 11:31:57 +0200 (CEST) Wed, 02 Apr 2014 23:39:15 +0500 (GMT+05:00) """.components(separatedBy: "\n") let types = NSTextCheckingResult.CheckingType.date.rawValue let detector = try NSDataDetector(types: types) var dates = [Date?]() for str in dateStrings { let fullRange = NSRange(str.startIndex..., in: str) detector.enumerateMatches(in: str, options: [], range: fullRange) { result, flags, stop in if let result = result, result.resultType == .date { dates.append(result.date) } else { dates.append(nil) } } } 

一些警告:

  • 检测可能是不确定的。 例如,“5月11日”(不包括年份)被解释为“当年5月11日”。
  • “5/11/2018”之类的歧义字符串根据设备的语言环境进行解释。 与en-US ,它是5月11日; en-GB是11月5日。

为了保存自己的后续问题,假设日期和时间在设备的时区中。 以第一个字符串为例:我在EDT时区所以12:26:20 EDT = 16:26:20 UTC。 当你打电话给print(dates[0]!)时,你会得到16:26:20 ,因为Date始终以UTC 16:26:20 print(dates[0]!)