如何在 Swiftyjson 中检查值是日期字符串还是双精度值?

Posted

技术标签:

【中文标题】如何在 Swiftyjson 中检查值是日期字符串还是双精度值?【英文标题】:How to check if value is datestring or double in Swifty json? 【发布时间】:2017-08-17 14:45:17 【问题描述】:

我正在使用 Swifty json 解析 json。现在我有一个作为"create_date" 的键,它可以有一个时间戳和一个日期字符串,比如“2017-08-17 20:00:00”。现在我不确定它什么时候是字符串日期或者它是一个时间戳。我正在使用下面的代码来解析这个

if  let timeInterval = dic?["created_at"].doubleValue  
    print("timeinterval is \(timeInterval)")
    date1 = NSDate(timeIntervalSince1970: (timeInterval / 1000))
    date = self.getStrDateFromDate(dob: date1!) as String

如果使用dict["create_date"].doubleValue,那么如果它是一个字符串日期,那么它会返回我 2017 并且如果是时间戳,它会返回一些时间戳作为 15383673563465 。

现在我如何确定是日期还是时间戳?

【问题讨论】:

只需在if let 的末尾添加一个类型转换。 如果你的 dict 是 JSON,那么你可以if let timeInterval = dic?["created_at"].string 如果是时间戳,我认为它也是一个字符串。如果它包含“-”,我已经添加了条件 对于该示例时间戳字符串,您可能必须除以 10000 而不是 1000。只是猜测,因为除以 10000 得出的日期时间为 2018 年 10 月 1 日 00:15 和除以 1000 为 2457 年 6 月 27 日 14:39。 【参考方案1】:

使用可选绑定并使用 SwiftyJSON 的 double 属性将值转换为 Double。如果向下转换成功,则从Date 创建字符串,否则直接使用日期字符串。

let dateString : String
if let timeInterval = dic?["created_at"].double  
    print("timeinterval is \(timeInterval)")
    date1 = Date(timeIntervalSince1970: timeInterval / 1000)
    dateString = self.getStrDateFromDate(dob: date1!) as String
 else 
    dateString = dic?["created_at"].stringValue

旁注:

你为什么(桥接)将结果转换为应该是字符串的字符串(来自getStrDateFromDate)?

【讨论】:

【参考方案2】:

我会尝试使用您可能的日期字符串格式的DateFormatter,然后尝试将其转换为双精度。或反之亦然。顺序真的没有太大关系,尽管先检查双精度可能会稍微便宜一些。

import Foundation

func convertDate(dateString:String) -> Date? 
  // try `Double`
  if let timestamp = Double(dateString) 
    return Date(timeIntervalSince1970: timestamp)
  

  // try `DateFormatter`
  let formatter = DateFormatter()
  formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
  if let date = formatter.date(from: dateString) 
    return date
  

  // give up
  return nil


let dateString1 = String(Date().timeIntervalSince1970)
let dateString2 = "2017-08-17 20:00:00"
let dateString3 = "something"

print(convertDate(dateString: dateString1) ?? "unknown")
print(convertDate(dateString: dateString2) ?? "unknown")
print(convertDate(dateString: dateString3) ?? "unknown")

// 2017-08-17 15:15:27 +0000
// 2017-08-18 00:00:00 +0000
// unknown

请注意,Date 的默认 description 使用 GMT。在我的情况下,它关闭了 4 小时,这就是为什么显示的时间与我输入的时间不同 4 小时。

【讨论】:

以上是关于如何在 Swiftyjson 中检查值是日期字符串还是双精度值?的主要内容,如果未能解决你的问题,请参考以下文章

swiftyJSON检查value是否为null

如何使用 SwiftyJSON 从深度嵌套的 JSON 字典中获取字符串 [重复]

当 BigQuery 中的值是字符串或日期时,Case 如何与 else 一起使用?

如何检查键值是字符串还是整数(ios,Android)

Laravel - 如何在日期字符串中检查当前月份?

如何使用 SwiftyJSON 获取字符串元素数组?