【问题标题】:Convert time string to Unix time date of the same day将时间字符串转换为同一天的 Unix 时间日期
【发布时间】:2019-02-24 18:04:09
【问题描述】:

如何将字符串小时转换为一天中的毫秒?

例如:

let strDate = "06:00 PM"

或者:

let strDate = "09:00 AM"

我的代码:

let dateString = "06:00 PM"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
guard let date = dateFormatter.date(from: dateString)
else { fatalError() }
print(date)

例如,我的字符串是:06:00 PM,所以我想以今天 2018 年 9 月 20 日星期四下午 06:00 的毫秒数为单位

【问题讨论】:

  • 欢迎来到 StackOverflow。抱歉,这个网站不是代码编写服务。编辑您的问题并发布您尝试过的内容以及您面临的问题。
  • 已编辑............
  • 您的日期格式错误 HH 是 24 小时格式

标签: swift nsdateformatter foundation


【解决方案1】:

首先需要解析日期字符串:

let dateString = "06:00 PM"
let formatter = DateFormatter()
formatter.defaultDate = Date()
formatter.dateFormat = "hh:mm a"
formatter.locale = Locale(identifier: "en_US_POSIX")
let date = formatter.date(from: dateString)

然后,您需要开始一天的工作:

let calendar = Calendar.current
let start = calendar.startOfDay(for: date)

之后,获取datestart之间的时间间隔:

let timeInterval = date.timeIntervalSince(start)
let milliseconds = timeInterval * 1000.0

【讨论】:

  • 这不好也许你不明白,例如我的字符串是:06:00 PM,所以我想得到今天 2018 年 9 月 20 日星期四 06:00 PM 的毫秒日期
  • @mickael 您的意思是当地时间 2018 年 9 月 20 日星期四下午 6:00 的 unix 纪元时间?
  • @mickael 输入字符串中不包含日期。你想今天假设吗?
  • @Sweeper 如果您没有将日期格式化程序语言环境设置为 en_US_POSIX,如果用户语言环境/设置设置为 24 小时,这可能会失败
  • @LeoDabus 总是能吸引我的地方。已编辑。
【解决方案2】:

您可以将 DateFormatter 的默认日期设置为今天的 startOfDay,在解析时间时将格式化程序语言环境设置为“en_US_POSIX”,然后您可以简单地获取结果日期 timeIntervalSince1970 并乘以 1000:

let strTime = "06:00 PM"
let formatter = DateFormatter()
formatter.defaultDate = Calendar.current.startOfDay(for: Date())
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "hh:mm a"
if let date = formatter.date(from: strTime) {
    let milliseconds = date.timeIntervalSince1970 * 1000
    print(milliseconds) // 1537477200000
    let date2 = Date(timeIntervalSince1970: milliseconds/1000)
    print(date2.description(with: .current))  // Thursday, September 20, 2018 at 6:00:00 PM Brasilia Standard Time
}

【讨论】:

  • 这将包括当前秒/纳秒的差异。最好将formatter.defaultDate 设置为当天的开始(如上所述)。
  • 时区有问题,我发现它在下午 03:00 而不是下午 06:00 返回结果,为什么?
  • @mickael 您需要使用区域设置打印日期描述。如果您想要 UTC 时间下午 6 点,您需要将格式化程序时区设置为 zeroSecondsFromGMT
猜你喜欢
  • 2019-07-30
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2011-09-23
相关资源
最近更新 更多