Swift 中的月份和星期名称
Name of month and week of in Swift
在 Swift 中,我需要获取月份名称和星期:
示例:6 月 2 日 - 8 日
我已经为 Date() 创建了一个扩展 class 并且我确实得到了月份名称,但它是缩写的并且星期是用 Optional() 打印出来的。
所以我这周需要这个。 2 - 8。我知道 - 可以是字符串文字,所以我不担心。
extension Date {
func monthAsString() -> String {
let df = DateFormatter()
df.setLocalizedDateFormatFromTemplate("MMM")
return df.string(from: self)
}
func startOfWeek() -> String? {
let gregorian = Calendar(identifier: .gregorian)
let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
return String(describing: gregorian.date(byAdding: .day, value: 1, to: sunday))
}
func endOfWeek() -> String? {
let gregorian = Calendar(identifier: .gregorian)
let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
return String(describing: gregorian.date(byAdding: .day, value: 7, to: sunday))
}
}
在 UILabel 中,我需要显示如下内容:
6 月 2 日至 8 日或 9 月 22 日至 28 日
就这样。
首先,使用 "MMMM"
,而不是 "MMM"
来获取完整的月份名称。
接下来,除了调试之外,永远不要使用 String(describing:)
。
更好的解决方案是生成一周的开始和结束这两个日期。然后使用 DateIntervalFormatter
从两个日期生成一个字符串。
这是更新后的日期扩展,用于生成日期而不是字符串:
extension Date {
func startOfWeek() -> Date? {
let gregorian = Calendar(identifier: .gregorian)
if let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) {
return gregorian.date(byAdding: .day, value: 1, to: sunday)
} else {
return nil;
}
}
func endOfWeek() -> Date? {
let gregorian = Calendar(identifier: .gregorian)
if let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) {
return gregorian.date(byAdding: .day, value: 7, to: sunday)
} else {
return nil
}
}
}
下面是一个示例,展示了如何使用 DateIntervalFormatter
来获得所需的结果:
let aDate = Date()
if let sow = aDate.startOfWeek(), let eow = aDate.endOfWeek() {
let formatter = DateIntervalFormatter()
formatter.dateTemplate = "MMMMd"
print(formatter.string(from: sow, to: eow))
}
输出:
September 9 - 15
在 Swift 中,我需要获取月份名称和星期:
示例:6 月 2 日 - 8 日
我已经为 Date() 创建了一个扩展 class 并且我确实得到了月份名称,但它是缩写的并且星期是用 Optional() 打印出来的。
所以我这周需要这个。 2 - 8。我知道 - 可以是字符串文字,所以我不担心。
extension Date {
func monthAsString() -> String {
let df = DateFormatter()
df.setLocalizedDateFormatFromTemplate("MMM")
return df.string(from: self)
}
func startOfWeek() -> String? {
let gregorian = Calendar(identifier: .gregorian)
let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
return String(describing: gregorian.date(byAdding: .day, value: 1, to: sunday))
}
func endOfWeek() -> String? {
let gregorian = Calendar(identifier: .gregorian)
let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
return String(describing: gregorian.date(byAdding: .day, value: 7, to: sunday))
}
}
在 UILabel 中,我需要显示如下内容:
6 月 2 日至 8 日或 9 月 22 日至 28 日
就这样。
首先,使用 "MMMM"
,而不是 "MMM"
来获取完整的月份名称。
接下来,除了调试之外,永远不要使用 String(describing:)
。
更好的解决方案是生成一周的开始和结束这两个日期。然后使用 DateIntervalFormatter
从两个日期生成一个字符串。
这是更新后的日期扩展,用于生成日期而不是字符串:
extension Date {
func startOfWeek() -> Date? {
let gregorian = Calendar(identifier: .gregorian)
if let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) {
return gregorian.date(byAdding: .day, value: 1, to: sunday)
} else {
return nil;
}
}
func endOfWeek() -> Date? {
let gregorian = Calendar(identifier: .gregorian)
if let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) {
return gregorian.date(byAdding: .day, value: 7, to: sunday)
} else {
return nil
}
}
}
下面是一个示例,展示了如何使用 DateIntervalFormatter
来获得所需的结果:
let aDate = Date()
if let sow = aDate.startOfWeek(), let eow = aDate.endOfWeek() {
let formatter = DateIntervalFormatter()
formatter.dateTemplate = "MMMMd"
print(formatter.string(from: sow, to: eow))
}
输出:
September 9 - 15