【问题标题】:How to print name of the day of the week?如何打印星期几的名称?
【发布时间】:2018-08-09 02:02:28
【问题描述】:

我试图打印出星期几的名称,即星期一、星期二、星期三。我目前有一些代码可以做到这一点。我想知道是否有办法摆脱我的 switch 语句并使它变得更好。谢谢!

 func getDayOfWeek(_ today: String) -> String? {
    let formatter  = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    guard let todayDate = formatter.date(from: today) else { return nil }
    let myCalendar = Calendar(identifier: .gregorian)
    let weekDay = myCalendar.component(.weekday, from: todayDate)

    switch weekDay {
    case 1:
        return "Sunday"
    case 2:
        return "Monday"
    case 3:
        return "Tuesday"
    case 4:
        return "Wednesday"
    case 5:
        return "Thursday"
    case 6:
        return "Friday"
    case 7:
        return "Saturday"
    default:
        return ""
    }
}



getDayOfWeek("2018-3-5")

这会打印出“星期一”

【问题讨论】:

  • 我不确定,但也许你应该用 2018-03-05 代替?

标签: ios swift date calendar nsdatecomponents


【解决方案1】:

您使用了错误的日期格式。正确的格式是"yyyy-M-d"。除此之外,您还可以使用 Calendar 属性 weekdaySymbols 返回本地化的工作日。

func getDayOfWeek(_ date: String) -> String? {
    let formatter  = DateFormatter()
    formatter.dateFormat = "yyyy-M-d"
    formatter.locale = Locale(identifier: "en_US_POSIX")
    guard let todayDate = formatter.date(from: date) else { return nil }
    let weekday = Calendar(identifier: .gregorian).component(.weekday, from: todayDate)
    return Calendar.current.weekdaySymbols[weekday-1] // "Monday"
}

另一种选择是使用 DateFormatter 并将 dateFormat 设置为 "cccc",正如您在 answer 中看到的那样:

extension Formatter {
    static let weekdayName: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "cccc"
        return formatter
    }()
    static let customDate: DateFormatter = {
        let formatter  = DateFormatter()
        formatter.dateFormat = "yyyy-M-d"
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }()
}
extension Date {
    var weekdayName: String { Formatter.weekdayName.string(from: self) }
}

使用您的函数上方的扩展将如下所示:

func getDayOfWeek(_ date: String) -> String? { Formatter.customDate.date(from: date)?.weekdayName }

游乐场测试:

getDayOfWeek("2018-3-5")  // Monday
Date().weekdayName        // Thursday

【讨论】:

  • 这确实有效!如果我不想使用“语言环境”怎么办?我可以删除那条线吗?
  • @user7097242 如果您使用的是固定日期格式,则区域设置很重要。
  • 好的,什么是 [weekday-1]?这是黑客攻击还是什么?
  • weekdaySymbols 返回一个数组。第一个索引是 0 所以你需要减去 1
  • 哇,好东西!似乎它在操场上工作。感谢您的帮助。
【解决方案2】:

使用此功能:

func DayOfWeek(date: String) -> String?
{
    let dateFormatter  = DateFormatter()
    dateFormatter.dateFormat = "yyyy-M-d"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    guard let _date = dateFormatter.date(from: date) else { return nil }
    let weekday = Calendar(identifier: .gregorian).component(.weekday, from: _date)
    return Calendar.current.weekdaySymbols[weekday-1]
}

【讨论】:

    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多