日期格式化程序不工作

Date Formatter is not working

我有这个字符串

let myDate = "2018 年 1 月 10 日 06:31:01 下午"

我想把它转换成两个字符串

  1. 日期(dd)

  2. 年月(MMM yyyy)

为此,我正在使用此代码

let timeFormatter = DateFormatter()
 //first converting string into date

 timeFormatter.dateFormat = "dd MM yyyy hh:mm:ss a"
 let date = timeFormatter.date(from: myDate)
 // date into string

 let str = timeFormatter.string(from: date!)
 print(str )
 // know changing resultant string into desire format 

 timeFormatter.dateFormat = "dd"
 let strdate = timeFormatter.date(from: str)
 timeFormatter.dateFormat = "MMM yyyy"
 let fullDate = timeFormatter.date(from: str)
 cell.lblFullDate.text = "\(String(describing: strdate))"
 cell.lblDate.text = "\(String(describing: fullDate))"

当我 运行 它时,编译器卡在这一行

let date = timeFormatter.date(from: myDate)

因为这个日期格式不正确

timeFormatter.dateFormat = "dd MM yyyy hh:mm:ss a"

为此我应该使用什么 DateFormatter?

你可以试试这个

guard let timeString = single["earndate"] as? String else { return }

let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "dd MM yyyy hh:mm:ss a"
let date = timeFormatter.date(from: timeString)
let str = timeFormatter.string(from: date!)
print(str)
timeFormatter.dateFormat = "dd"
let strdate = timeFormatter.date(from: str)
timeFormatter.dateFormat = "MMM yyyy"
let fullDate = timeFormatter.date(from: str)
cell.lblFullDate.text = "\(String(describing: strdate))"
cell.lblDate.text = "\(String(describing: fullDate))"

如果遇到错误,请在分配前检查

 guard let earnDate = single["earndate"] as? String else { return }

Your are try to get the two different strings from a date is completely wrong.

喜欢

    let timeFormatter = DateFormatter()
    timeFormatter.dateFormat = "dd MMM yyyy hh:mm:ss a"
    let date = timeFormatter.date(from: "10 Jan 2018 06:31:01 PM")
     timeFormatter.dateFormat = "dd-MMM yyyy"
    let str = timeFormatter.string(from: date!)
   let finalVal = str.components(separatedBy: "-")
    print(finalVal.first ?? "" )
    print(finalVal.last ?? "" )

输出

由于您没有 post 收到任何错误消息,并且您编写的使用 DateFormatter 将字符串转换为日期的代码是正确的,我建议您检查 (single["earndate"] as? String)

这可能会返回 nil,并让您的编译器获得 "stuck"。

你可以使用 guard 语句:

   guard let earnDate = single["earndate"] as? String else { return }
   var date = "";
   if earnDate {
         date = timeFormatter.date(from: earnDate)
   }

尝试

timeFormatter.dateFormat = "DD"
let strdate = timeFormatter.string(from: date!)

timeFormatter.dateFormat = "MMM yyyy"
let fullDate = timeFormatter.string(from: date!)

输出

你的代码乱七八糟,到处都是Strings和Dates,你应该一步一步地重新开始。

  1. 使用适当的格式化程序将日期解析为 date 变量
  2. 根据不同的格式(使用不同的格式化程序或更改现有格式)从 date 创建字符串表示形式
  3. 使用另一种格式再次执行第 2 步,以获得第二个输出

特别是 str 应该完全删除。