如何移除FireStore获取日期的+0000并在ForEach的Text中显示
实现方案
完全可以直接在ForEach循环的Text组件内完成日期格式处理,不需要修改当前MyBook的字段赋值逻辑。
方案1:固定位截断(性能最优,适配当前固定格式场景)
你当前拿到的日期字符串结构固定为yyyy-MM-dd HH:mm:ss +0000,目标内容固定为字符串前19位,直接在Text中截取即可:
ForEach(bookArray) { item in Text(String(item.bookDate.prefix(19))) }
- 注意:该方案仅适用于FireStore返回的日期字符串格式完全固定、时区后缀长度不变的场景,写法最轻量无额外开销。
方案2:格式化器转换(鲁棒性更强,适配格式变动场景)
如果担心后续接口返回的日期格式、时区后缀有变动,建议通过日期格式化器做解析转换,避免硬编码截取长度出错。
首先在视图作用域内定义全局复用的格式化器(不要在循环内重复创建,避免性能损耗):
private let firestoreInputFormatter: DateFormatter = { let fmt = DateFormatter() fmt.dateFormat = "yyyy-MM-dd HH:mm:ss Z" fmt.locale = Locale(identifier: "en_US_POSIX") return fmt }() private let targetOutputFormatter: DateFormatter = { let fmt = DateFormatter() fmt.dateFormat = "yyyy-MM-dd HH:mm:ss" return fmt }()
之后在ForEach的Text组件中直接做转换即可,自带解析失败兜底逻辑:
ForEach(bookArray) { item in Text( firestoreInputFormatter.date(from: item.bookDate) .map { targetOutputFormatter.string(from: $0) } ?? item.bookDate ) }
- 该方案会先把原始字符串解析为日期对象,再按目标格式输出字符串,即使后续返回的时区变为
+08:00这类带分隔符的格式,也能正确解析,不会出现内容截断错误。
内容的提问来源于stack exchange,提问作者Steven-Carrot
相关产品推荐
相关产品推荐

