JJLISO8601DateFormatter

JJLISO8601DateFormatter 是一个线程安全、功能完整且可直接替换 NSISO8601DateFormatter 的替代方案,在日期与字符串之间的转换速度方面快 10 倍或更多。

NSISO8601DateFormatter 相比:

与新的 Swift Date 转换方法(对于较新版本的 iOS,字符串转日期日期转字符串)相比:

有关如何进行基准测试的更多信息请点击此处

用法

因为它可直接替换,您只需将 NSISO8601DateFormatter 替换为 JJLISO8601DateFormatter 并添加头文件 #import <JJLISODateFormatter/JJLISODateFormatter.h>

要求

安装

Cocoapods

JJLISO8601DateFormatter 可通过 CocoaPods 获取。 要安装它,只需将以下行添加到您的 Podfile 中

pod 'JJLISO8601DateFormatter'

常见问题解答

这个日期格式化库如何保持与时区新变化同步?

它使用系统提供的时间区文件,与 localtime 等 POSIX 函数使用的文件相同。 如果找不到这些文件,它将回退到使用 Apple 的日期格式化库。

为什么它这么快?

这个库并没有什么特别之处。 它用直接的 C 编写,并尽量避免不必要的分配、锁定等。 它使用来自 tzdbmktimelocaltime 版本。 更好的问题是,为什么 Apple 的库这么慢? Apple 的日期格式化类构建在 ICU 之上,虽然可靠,但它是一个相当慢的库。 很难一眼就说清楚具体原因,但它似乎有很多额外的抽象、不必要的复制等等,并且总体上没有优先考虑性能。

日期格式化是困难的。 这个库如何确保正确性?

虽然日期格式化很困难,但这个库有一套广泛的单元测试,涵盖了以下边缘情况:

事情也变得更容易,因为对于 ISO 8601,我们只需要支持公历。

对于所有事情都完全一样吗?

对于无意义的格式选项(一年中的星期但没有年份)和格式错误的日期字符串,行为略有不同。 但对于所有目的而言,它都是完全相同的。 如果您发现其他情况,请随时提交工单。

为什么前缀是 “JJL”?

因为它很容易用左手小指按住 shift 键输入。

还有其他 Apple 库可以进行优化吗?

是的,有很多,问题是哪些值得优化。 请随意请求对导致您出现性能问题的库进行优化。

基准测试是如何完成的?

它是通过对两个范围内(从现在起前后 15 天,从 1970 年到现在),三个时区以及格式选项 NSISO8601DateFormatOptionsWithInternetDateTime | NSISO8601DateFormatWithFractionalSeconds 的许多日期到字符串和字符串到日期转换进行计时来完成的。 基准测试代码位于示例项目的 view controller-viewDidLoad 中,您可以通过运行该项目来获得良好的基准测试输出。 我通常在我的 iPhone 8 上进行测试,偶尔会在其他设备上进行二次检查。 显然,这些数字可能会有所不同。

未来的改进和贡献

随时欢迎贡献者。 以下是一些可能的改进:

作者

Michael Eisel, michael.eisel@gmail.com

许可证

JJLISO8601DateFormatter 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件。