【问题标题】:Convert Date from one format to another将日期从一种格式转换为另一种格式
【发布时间】:2020-05-27 18:27:23
【问题描述】:

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

   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!
    }

【问题讨论】:

  • 这毫无意义,因为Date 没有格式。您可能希望从 string 开始,将其转换为日期,然后再转换回字符串(具有不同的格式)。
  • 日期为零,因为您的 stringDate 与您期望的实际格式的格式不匹配(期望使用 /,但您给它一个带有 - 的字符串)。但你实际上在做什么?日期是日期 - 它是一个对象。当您需要转换它时,您可以对其应用任何格式。说日期对象本身有格式是没有意义的
  • @MartinR 对我的要求是将日期从一种格式化程序转换为不同格式的日期。我不想返回字符串格式
  • A Date 是时间的绝对值(内部表示为自 2000 年 1 月 1 日以来的秒数。Date 没有格式。
  • 其他人都已经说过了,但是 Date 没有格式。当你把它转换成一个字符串时,有一个格式。

标签: ios swift xcode swift4


【解决方案1】:

如果您需要从一个格式化的日期字符串转换为另一个格式化的日期字符串,您可以使用两个DateFormatters:一个 - 输入格式化程序将字符串转换为中介 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 对象本身没有格式化 - 它是日期和时间的纯粹表示,您可以使用不同的格式化程序进行转换。

【讨论】:

  • 上面的代码返回一个字符串。我需要一个日期。 toFormatter.string(date) 行返回一个字符串
  • 您不是在评论中说您需要将一个格式化字符串转换为另一种格式化字符串吗? @user578386
  • 在我的问题中。我已经提到我需要一个日期......而且我的函数返回类型是日期类型......我不需要字符串
  • 好的,所以你希望你的函数返回一个日期,并且输入是一个格式化的字符串? @user578386
  • /// "2020-05-28 00:20:00 GMT+5:30" 将是我的输入字符串,我希望它是日期对象 2020/05/28 00:20:00格林威治标准时间+5:30
【解决方案2】:

一个 swift 类 Date 没有格式。

在您的代码中,您的 stringDate 采用“yyyy-MM-dd HH:mm:ss z”格式。如果您需要将 String 转换为 Date,您必须使用相同的格式,否则它将返回 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
}

【讨论】:

    【解决方案3】:

    您的代码中有三个问题。首先,在解析固定日期格式时,您应该始终将日期格式化程序的语言环境设置为“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"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2017-08-27
      相关资源
      最近更新 更多