将日期从一种格式转换为另一种格式

时间:2020-05-27 18:27:23

标签: ios swift xcode swift4

我试图将日期从一种格式转换为另一种格式。但是以下代码中的日期为零。你们能帮我吗,下面是代码。

   func eventTimeDate() -> Date {
        let dtf = DateFormatter()
        dtf.timeZone = TimeZone.current
        dtf.dateFormat = "yyyy-MM-dd HH:mm:ss z" 

        /// "2020-05-28 00:20:00 GMT+5:30"   
        let stringDate = dtf.string(from: self)

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss z"

        /// nil
        let date = dateFormatter.date(from: stringDate)

        return date!
    }

3 个答案:

答案 0 :(得分:0)

如果需要从一个格式化的日期字符串转换为另一种格式化的日期字符串,则可以使用两个DateFormatter:一个-输入格式化程序,用于将String转换为中间Date对象,以及然后-使用输出格式程序-从日期转换为字符串。

func reFormat(from dateStr: String) -> String? {
  let fromFormatter = DateFormatter()
  fromFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss z"

  let toFormatter = DateFormatter()
  toFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss z"

  guard let date = fromFormatter.date(from: dateStr) else { return nil }

  return toFormatter.string(from: date)
}

如果您只需要返回一个Date对象,那么它是一个仅使用一个DateFormatter的简单函数:

func toDate(from dateStr: String) -> Date? {
  let formatter = DateFormatter()
  formatter.dateFormat = "yyyy-MM-dd HH:mm:ss z"

  return formatter.date(from: dateStr)
}

Date对象本身没有格式-它是日期和时间的纯表示形式,您可以使用不同的格式器将其转换为日期和时间。

答案 1 :(得分:0)

快捷课程日期没有格式。

在您的代码中,您的 stringDate 格式为“ yyyy-MM-dd HH:mm:ss z”。如果需要将字符串转换为日期,则必须使用相同的格式,否则将返回nil。

如果您想更改字符串的格式,请先将其转换为Swift' Date ',然后使用新的Formatter将其转换为字符串。

func eventTimeDate(dateString : String, currentFormat : String, newFormat : String) -> String? {
    let currentDateFormatter = DateFormatter()
    currentDateFormatter.calendar = Calendar(identifier: Calendar.Identifier.gregorian)
    currentDateFormatter.locale = Locale(identifier: "en_IN")
    currentDateFormatter.dateFormat = currentFormat
    let date = currentDateFormatter.date(from: dateString)

    let newDateFormatter = DateFormatter()
    newDateFormatter.calendar = Calendar(identifier: Calendar.Identifier.gregorian)
    newDateFormatter.locale = Locale(identifier: "en_IN")
    newDateFormatter.dateFormat = newFormat
    if let date = date {
        let newDateString = newDateFormatter.string(from: date)
        return newDateString
    }
    return nil
}

答案 2 :(得分:0)

您的代码中存在三个问题。首先,在解析固定日期格式时,应始终将日期格式器的语言环境设置为“ en_US_POSIX”。其次,您需要转义日期字符串的GMT。最后但并非最不重要的一点是,您需要修复时区字符串,该字符串在时区小时中缺少前导零:

let dateStr = "2020-05-28 00:20:00 GMT+5:30"
let formatter = DateFormatter()
// set the date formatter's locale to "en_US_POSIX"
formatter.locale = .init(identifier: "en_US_POSIX")
// escape the GMT of your date string
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss 'GMT'Z"
// add the leading zero for your timezone hour
let string = dateStr.replacingOccurrences(of: "(GMT[+-])(\\d:)", with: "$10$2", options: .regularExpression)
if let date = formatter.date(from: string) {
    print(date)  // "2020-05-27 18:50:00 +0000\n"
}