在 SwiftUI 中获取中文本地化的年龄

Get age for Chinese localization in SwiftUI

当用户的区域设置使用公历时,我有这个函数非常适合计算年龄

func calcAge(birthday: String) -> Int {
    let dateFormater = DateFormatter()
    dateFormater.dateFormat = "MM/dd/yyyy"
    let birthdayDate = dateFormater.date(from: birthday)
    let calendar: NSCalendar! = NSCalendar(calendarIdentifier: .gregorian)
    let calcAge = calendar.components(.year, from: birthdayDate!, to: project.date!, options: [])
    let age = calcAge.year
    return age!
  }

birthday 值只是存储在核心数据中的 Date() 值。

这是日期 -> 字符串函数

func birthdayAsString() -> String {
            let formatter = DateFormatter()
            formatter.dateFormat = "MMM d, yyyy"
            return formatter.string(from: birthday ?? Date())
        }

但是当区域设置为中文时,它会失败。我已经尝试添加一个 if 语句,但它仍然无法正确转换。感谢任何见解!

首先确保您的日期格式匹配,我注意到您使用 "MM/dd/yyyy" 但根据您对输入结构的评论,您应该使用 "MMM dd, yyyy" (Feb 4, 20152月 4, 2015).

接下来您要将 dateFormatter.locale = Locale(identifier: NSLocale.current.identifier) 添加到您的代码中以设置 日期格式化程序 对字符串的解释。您还需要确保在测试中文字符串(或任何其他语言环境字符串)时,从 NSLocale.current.identifier 返回的当前语言环境是正确的。 (或者您可以手动设置,如果为了测试,我将语言环境设置为 "zh_Hant_HK" 并且它适用于 "2月 4, 2015"

最后,我删除了日历并使用变量 timeIntervalSince1970 替换了逻辑,其中 returns 自 1970 年以来的秒数和那个日期。然后我计算了当前间隔之间的差异并将秒数转换为年数。

下面的代码是有效的(只要确保您正在测试的字符串的语言环境是正确的!)

/**
 * @returns number of years since birthday date. returns -1 if there is an error.
 */
func calcAge(birthday: String) -> Int {
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: NSLocale.current.identifier)
    dateFormatter.dateFormat = "MMM dd, yyyy"
    let birthdayDate = dateFormatter.date(from: birthday)
    var timeElapsed: TimeInterval = Date().timeIntervalSince1970
    guard let timeSinceBirthday = birthdayDate?.timeIntervalSince1970 else {
        return -1
    }
    timeElapsed -= timeSinceBirthday
    timeElapsed /= 60 * 60 * 24 * 365
    return Int(timeElapsed)
}