在 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, 2015
和 2月 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)
}
当用户的区域设置使用公历时,我有这个函数非常适合计算年龄
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, 2015
和 2月 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)
}