Swift中日期字符串与当前日期比较结果不符问题求助
Swift日期比较异常:预期Active却输出Expired的原因与解决
问题根源
你的代码中,dateFormatter.dateFormat = "yyyy-MM-dd"解析出的ticketDate是该日期当天的起始时间(比如2023-04-04 00:00:00),而Date()获取的currentDate是当前的精确时间(比如2023-04-04 15:30:00)。直接比较时间戳时,当天的任意时刻都会比当天0点的时间戳大,因此即使是同一天,也会触发currentDate > ticketDate,输出"Expired"。
解决方案
如果你的需求是只要日期未过当天就算Active(包括当天的任何时间),可以通过以下两种方式实现:
方案1:使用Calendar比较日期组件(推荐)
利用Calendar的方法忽略时分秒,只比较年、月、日:
func getDateFromDateString(date: String) -> Date { let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") dateFormatter.dateFormat = "yyyy-MM-dd" return dateFormatter.date(from: date) ?? Date() } let ticketDate = getDateFromDateString(date: "2023-04-04") let currentDate = Date() let calendar = Calendar.current // 判断当前日期早于或等于ticketDate的日期 if calendar.compare(currentDate, to: ticketDate, toGranularity: .day) != .orderedDescending { print("Active") } else { print("Expired") }
方案2:将当前日期截断到当天起始时间
把currentDate也转换为当天0点,再进行比较:
func getDateFromDateString(date: String) -> Date { let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") dateFormatter.dateFormat = "yyyy-MM-dd" return dateFormatter.date(from: date) ?? Date() } let ticketDate = getDateFromDateString(date: "2023-04-04") let currentDate = Date() let calendar = Calendar.current let truncatedCurrentDate = calendar.startOfDay(for: currentDate) if truncatedCurrentDate > ticketDate { print("Expired") } else { print("Active") }
补充说明
如果你的需求是ticketDate的时间必须晚于当前精确时间(比如票在当天24点前都有效),可以修改日期格式为包含时分秒的格式,或者将ticketDate设置为当天的23:59:59后再比较。
内容的提问来源于stack exchange,提问作者Arnav Singh
相关产品推荐
相关产品推荐

