iOS Date()
返回日期的精度至少为微秒。
我通过调用Date().timeIntervalSince1970
导致1490891661.074981
然后,我需要将日期转换为微秒精度的字符串。
我使用DateFormatter
以下方式:
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ"
print(formatter.string(from: date))
导致
"2017-03-30T16:34:21.075000Z"
现在,如果我们比较两个结果:
1490891661.074981
并且"2017-03-30T16:34:21.075000Z"
我们可以注意到将DateFormatter
日期舍入为毫秒精度,同时仍然以微秒为单位显示零。
有人知道如何配置,DateFormatter
以便我可以保持微秒并获得正确的结果"2017-03-30T16:34:21.074981Z"
吗?
感谢@MartinR解决了我的问题的上半部分,并感谢@ForestKunecke给了我一些解决问题的后半部分的技巧。
基于他们的帮助,我创建了现成的解决方案,该解决方案可以毫秒精度将字符串中的日期转换为字符串,反之亦然:
public final class MicrosecondPrecisionDateFormatter: DateFormatter {
private let microsecondsPrefix = "."
override public init() {
super.init()
locale = Locale(identifier: "en_US_POSIX")
timeZone = TimeZone(secondsFromGMT: 0)
}
required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override public func string(from date: Date) -> String {
dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let components = calendar.dateComponents(Set([Calendar.Component.nanosecond]), from: date)
let nanosecondsInMicrosecond = Double(1000)
let microseconds = lrint(Double(components.nanosecond!) / nanosecondsInMicrosecond)
// Subtract nanoseconds from date to ensure string(from: Date) doesn't attempt faulty rounding.
let updatedDate = calendar.date(byAdding: .nanosecond, value: -(components.nanosecond!), to: date)!
let dateTimeString = super.string(from: updatedDate)
let string = String(format: "%@.%06ldZ",
dateTimeString,
microseconds)
return string
}
override public func date(from string: String) -> Date? {
dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
guard let microsecondsPrefixRange = string.range(of: microsecondsPrefix) else { return nil }
let microsecondsWithTimeZoneString = String(string.suffix(from: microsecondsPrefixRange.upperBound))
let nonDigitsCharacterSet = CharacterSet.decimalDigits.inverted
guard let timeZoneRangePrefixRange = microsecondsWithTimeZoneString.rangeOfCharacter(from: nonDigitsCharacterSet) else { return nil }
let microsecondsString = String(microsecondsWithTimeZoneString.prefix(upTo: timeZoneRangePrefixRange.lowerBound))
guard let microsecondsCount = Double(microsecondsString) else { return nil }
let dateStringExludingMicroseconds = string
.replacingOccurrences(of: microsecondsString, with: "")
.replacingOccurrences(of: microsecondsPrefix, with: "")
guard let date = super.date(from: dateStringExludingMicroseconds) else { return nil }
let microsecondsInSecond = Double(1000000)
let dateWithMicroseconds = date + microsecondsCount / microsecondsInSecond
return dateWithMicroseconds
}
}
用法:
let formatter = MicrosecondPrecisionDateFormatter()
let date = Date(timeIntervalSince1970: 1490891661.074981)
let formattedString = formatter.string(from: date) // 2017-03-30T16:34:21.074981Z
如何捕获doSomeThing()方法调用引发的异常,然后再引发它?
我已经在tomcat 7.0.55中部署了一个应用程序进行测试。我想捕获“HeapDumpOnOutOfMemoryError”是否正在发生。以下是我的JVM参数。 JAVA_OPTS="-server-Xms512M-Xmx2048M-XX: PermSize=256m-XX: MaxPermSize=512m-XX: UseConcMarkSweepGC-XX: UseParNewGC-XX:
本文向大家介绍如何捕获 setTimeout 异常相关面试题,主要包含被问及如何捕获 setTimeout 异常时的应答技巧和注意事项,需要的朋友参考一下 No description provided.
问题内容: 我在Java中有一个应用程序,其中我尝试确保如果有人在代码中退出代码System.exit(),则应调用侦听器来执行某些操作,例如记录消息并释放资源… 我如何实施它,欢迎任何建议/方法。 问题答案: 该方法可用于添加一个关闭钩子,该钩子基本上是未启动的,该钩子在Java虚拟机关闭时执行。 但是,这是应该谨慎对待的领域,因为它是在JVM生命周期的非常敏感的时间执行的。从API规范中获取该
问题内容: 我在jpa中使用了hibernate模式,并且使用persistence.xml进行了配置。是否可以从Web应用程序获取hibernate连接属性? 谢谢。 问题答案: 可能并非没有反射,而是依靠Hibernate在将来不会破坏您的代码。您需要从SessionFactory获取属性,但是它不是公开的,因此您必须通过反射找到Field,然后使用field.setAccessible获取对
问题内容: 我在Python中构建了一个简短的url转换器引擎,并且看到大量的“管道破损”错误,并且很好奇在使用BaseHTTPServer类时如何最好地捕获它。这不是全部代码,但可以让您大致了解我目前正在做什么: 该代码本身运行良好,但是在生产中几乎立即开始引发错误: 这些错误的大部分似乎源于在调用send_header()方法时遇到的问题,其中我要写的是: 所以我很好奇在我的代码中尝试捕获此I