JJLISO8601DateFormatter
是一个线程安全、功能完整且可直接替换 NSISO8601DateFormatter
的替代方案,在日期与字符串之间的转换速度方面快 10 倍或更多。
与 NSISO8601DateFormatter
相比:
与新的 Swift Date
转换方法(对于较新版本的 iOS,字符串转日期 和 日期转字符串)相比:
有关如何进行基准测试的更多信息请点击此处。
因为它可直接替换,您只需将 NSISO8601DateFormatter
替换为 JJLISO8601DateFormatter
并添加头文件 #import <JJLISODateFormatter/JJLISODateFormatter.h>
。
JJLISO8601DateFormatter 可通过 CocoaPods 获取。 要安装它,只需将以下行添加到您的 Podfile 中
pod 'JJLISO8601DateFormatter'
它使用系统提供的时间区文件,与 localtime
等 POSIX 函数使用的文件相同。 如果找不到这些文件,它将回退到使用 Apple 的日期格式化库。
这个库并没有什么特别之处。 它用直接的 C 编写,并尽量避免不必要的分配、锁定等。 它使用来自 tzdb
的 mktime
和 localtime
版本。 更好的问题是,为什么 Apple 的库这么慢? Apple 的日期格式化类构建在 ICU 之上,虽然可靠,但它是一个相当慢的库。 很难一眼就说清楚具体原因,但它似乎有很多额外的抽象、不必要的复制等等,并且总体上没有优先考虑性能。
虽然日期格式化很困难,但这个库有一套广泛的单元测试,涵盖了以下边缘情况:
事情也变得更容易,因为对于 ISO 8601,我们只需要支持公历。
对于无意义的格式选项(一年中的星期但没有年份)和格式错误的日期字符串,行为略有不同。 但对于所有目的而言,它都是完全相同的。 如果您发现其他情况,请随时提交工单。
因为它很容易用左手小指按住 shift 键输入。
是的,有很多,问题是哪些值得优化。 请随意请求对导致您出现性能问题的库进行优化。
它是通过对两个范围内(从现在起前后 15 天,从 1970 年到现在),三个时区以及格式选项 NSISO8601DateFormatOptionsWithInternetDateTime | NSISO8601DateFormatWithFractionalSeconds
的许多日期到字符串和字符串到日期转换进行计时来完成的。 基准测试代码位于示例项目的 view controller 的 -viewDidLoad
中,您可以通过运行该项目来获得良好的基准测试输出。 我通常在我的 iPhone 8 上进行测试,偶尔会在其他设备上进行二次检查。 显然,这些数字可能会有所不同。
随时欢迎贡献者。 以下是一些可能的改进:
char *
而不是 NSString
的方法。Michael Eisel, michael.eisel@gmail.com
JJLISO8601DateFormatter 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件。