【问题标题】:How to get Monday 00:00 of current week? Swift 3如何获得本周的星期一 00:00?斯威夫特 3
【发布时间】:2016-10-02 17:57:06
【问题描述】:

我正试图从我约会的星期一 00:00 返回。这是我的代码:

func getMonday(myDate: Date) -> Date {
    let cal = Calendar.current
    let comps = cal.dateComponents([.weekOfYear, .yearForWeekOfYear], from: myDate)
    let beginningOfWeek = cal.date(from: comps)!
    return beginningOfWeek
}

我的问题是它不返回星期一 00:00 ,而是星期六 22:00。

例子:

    let monday1 = getMonday(myDate: date) //date is: 2016-10-04 17:00:00
    print(monday1) //Prints: 2016-10-01 22:00:00 (Saturday)

我的问题是:

如何从myDatemyDate返回星期一00:00?

非常感谢。

【问题讨论】:

  • 打印日期总是使用格林威治标准时间,所以我假设输出实际上是2016-10-01 22:00:00 +0000,也就是您所在时区的2016-10-02 00:00:00,即星期日。 Calendar 有一个 firstWeekday 属性,用于控制将哪一天视为一周中的第一天,您可能必须将其设置为 2=Monday。

标签: ios swift date swift3


【解决方案1】:

您的代码返回给定周的第一天,可能是 周日或周一(或其他日期),具体取决于您所在的地区。

如果您希望将星期一视为第一个工作日,则设置

cal.firstWeekday = 2

如果您想要给定一周的星期一,则与 一周的开始是,然后设置comps.weekday = 2:

func getMonday(myDate: Date) -> Date {
    let cal = Calendar.current
    var comps = cal.dateComponents([.weekOfYear, .yearForWeekOfYear], from: myDate)
    comps.weekday = 2 // Monday
    let mondayInWeek = cal.date(from: comps)!
    return mondayInWeek
}

请注意,打印 Date 始终使用 GMT 时区, 您需要一个 日期格式化程序 来根据您当地的时区打印结果。示例:

let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm"

let now = Date()
print(df.string(from: now)) // 2016-10-02 20:16

let monday1 = getMonday(myDate: now)
print(df.string(from: monday1)) // 2016-09-26 00:00

【讨论】:

  • 发现一个小错字。正确的变量名称是“firstWeekday”而不是“firstWeekDay”。
  • 您设置了cal.firstWeekday 的值,但您没有在getMonday() 中设置该值。我相信这会导致getMonday() 代码无法正常工作。根据我的测试,您需要同时设置 cal.firstWeekdaycomps.weekday 的值。
  • @ThomasW:我可能表达得很糟糕。通过设置cal.firstWeekday,您可以控制日历认为是一周中的第一天。例如,使用cal.firstWeekday = 7 表示星期六(而不是设置comps.weekday),该函数将返回前一个星期六(今天是星期四)。另一方面,如果你设置了comps.weekday = 7(而不是cal.firstWeekday),那么函数将返回当前周的星期六,即下一个星期六。
猜你喜欢
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多