【问题标题】:Date will not display correctly日期无法正确显示
【发布时间】:2018-02-11 10:52:41
【问题描述】:

我正在尝试显示我的日期,例如“2018 年 3 月 2 日晚上 10:00”。我尝试了“MM-dd-yyyy”和“yyyy-MM-dd hh:mm:ss”,但似乎这些组合都没有得到我想要的日期。选择日期的函数是 sendRequest,它使用的是UIDatePicker。

 func getCurrentDateTimeFromTimeStamp(timestamp:String)->String{
    let date = NSDate(timeIntervalSince1970:Double(timestamp)!)
    let formatter = DateFormatter()
    formatter.dateFormat = "MMMM d, yyyy HH:mm a"
    return formatter.string(from: date as Date)
}

 let dateCellVar = request.timestamp
    let dateString = dateCellVar.description
    dateCell.textLabel?.text = self.getCurrentDateTimeFromTimeStamp(timestamp: dateString)

class Request {
var timestamp:Double

init(dict: [String: Any]) {
    self.timestamp = dict["timestamp"] as? Double ?? 0.0
}

 func sendRequest(){
    print("HEY:")
    guard let user = currentUser else { return }
    print("USER: \(user.firstLastName)")

    if let da = dateField.text{
        print(da)
    }
    print(timeField.text)

    print(locationField.text)
    print(messageTextView.text)

    guard let pickedDate = pickedDate else { return print("pickedDate") }
    guard let date = dateField.text else { return print("pickedDate") }
    guard let time = timeField.text else { return print("time") }
    guard let location = locationField.text else { return print("location")}

    let db = Database.database().reference()
    let ref = db.child("requests").childByAutoId()
    let data = [
        "sender": user.uid,
        "recipient": recipientUser.uid,
        "name": user.firstLastName,
        "photoURL": user.photoURL,
        "location": location,
        "date": date,
        "time": time,
        "pickedTimestamp": pickedDate.timeIntervalSince1970,
        "message": messageTextView.text ?? "",
        "status": "PENDING",
        "timestamp": [".sv": "timestamp"]
        ] as [String:Any]

    print("HEYO")
    ref.setValue(data) { error, ref in
        if error == nil {
            print("Success")
        } else {
            print("Failed")
        }
    }


}

【问题讨论】:

标签: ios swift nsdateformatter


【解决方案1】:

根据您的结果,您的时间戳以毫秒为单位,而不是秒。你需要除以 1000。

你也打错了dateFormat。您想在一小时内使用hh,而不是HHH 是 24 小时制,当使用 a 表示 AM/PM 时没有任何意义。您还应该避免使用dateFormat。使用dateStyletimeStyle。让格式化程序为您提供最适合用户区域设置的日期。

您的代码也做了很多不必要的转换。您将时间戳记为Double,并将其存储为Double。但随后您的函数将您期望的秒数转换为String,然后您将其转换回Double。避免不必要地使用String

【讨论】:

  • 除以 1000 但时间仍显示为 24 小时格式
  • 你改成hh了吗?您的设备是否设置为 24 小时制?这就是为什么你真的应该使用dateStyletimeStyle。然后,您将获得适合用户区域设置和用户设置的格式。
  • 是的,我把它改成了“yyyy-MM-dd hh:mm a”,设备没有设置为24小时制。
【解决方案2】:

要获得序数日,您可以使用Calendar 从您的Date 中提取day

let date = Date()

let calendar = Calendar.current
let dateComponents = calendar.component(.day, from: date)
let numberFormatter = NumberFormatter()

numberFormatter.numberStyle = .ordinal
let day = numberFormatter.string(from: dateComponents as NSNumber)

从那里,您只需使用 DateFormatter 对您的日期格式进行编码,然后放入您在上面提取的序号日期,如下所示:

let dateFormatter = DateFormatter()

dateFormatter.dateFormat = "MMMM '\(String(describing: day!)),' yyyy h:mm a"

let dateString = "\(dateFormatter.string(from: date))"

print(dateString)

此外,你这一年的问题可能源于你喂它的数量。 timeIntervalSince1970 期待整秒,所以请确保你整秒喂它。

init(timeIntervalSince1970: TimeInterval) 返回一个日期对象 相对于 1970 年 1 月 1 日 00:00:00 UTC 由给定的初始化 秒数。

改编自this answer。此外,您可能会发现 this site 有助于格式化日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2019-04-22
    • 2023-02-09
    • 2020-02-04
    相关资源
    最近更新 更多