根据当地情况正确订购月份和日期



我想以可读的格式显示一周的开始和结束日期。使用MMMM d作为日期格式基础。例如:

- March 7 - 13
- February 28 - March 6
- 7-13 de marzo

所以,如果周的开始和结束都在同一个月,我只想提到一次月。我希望这在不同的地区都是准确的。例如,在西班牙语和白俄罗斯语中,日在月之前,在西班牙语中会有";de";添加到月份名称之前。

我正在使用

DateFormatter.dateFormat(
fromTemplate: "MMMM d",
options: 0,
locale: Locale(identifier: Bundle.main.preferredLocalizations.first

以获得正确的格式,然后尝试对其进行解析,并用两个数字替换日期,表示一周完全落入同一个月。我意识到我的代码有点粗糙,可能不能保证在所有可能的地方都能使用。但我不知道有没有更简单/更好的方法。

以下是我目前所拥有的:

func weekDateTitle(firstDay: Date, lastDay: Date) -> String {
let dateTemplate = DateFormatter.dateFormat(
fromTemplate: "MMMM d",
options: 0,
locale: Locale(identifier: Bundle.main.preferredLocalizations.first ?? "en"))
let formatter = DateFormatter()
// If the week ends on the same month as it begins, we use short label format,
// like "Month X - Y"
if firstDay.isSameMonth(as: lastDay) {
formatter.dateFormat = "MMMM"
let month = formatter.string(from: firstDay)

formatter.dateFormat = "d"
let days = "(formatter.string(from: firstDay)) - (formatter.string(from: lastDay))"

return dateTemplate?
.replacingFirstOccurrence(of: "MMMM", with: month)
.replacingFirstOccurrence(of: "d", with: days)
.replacingOccurrences(of: "'", with: "") ?? ""
} else {
// Not really important 
}
}

考虑DateIntervalFormatter:

let formatter = DateIntervalFormatter()
formatter.locale = locale
formatter.dateTemplate = "MMMMd"
let string = formatter.string(from: date1, to: date2)

对于同一个月,这将产生"7–13 de marzo"one_answers"3月7日–13英寸。

对于不同的月份,"7 de febrero–13 de marzo"one_answers"2月7日–3月13日"。

这些格式化程序有一些奇怪的边缘情况(例如,.longdateStyle适用于英语地区,但不适用于其他地区(。如果以上内容在您的所有目标地区都不能完美运行,我也不会感到惊讶,所以您可能需要仔细检查。但是,根据我的经验,这些格式化程序可以让你非常接近。它似乎实现了你在英语和西班牙语中所需要的…

相关内容

  • 没有找到相关文章

最新更新