Получить даты начала и окончания прошлой недели и прошлого месяца - PullRequest
0 голосов
/ 10 апреля 2019

Получить даты начала и окончания последней недели и прошлого месяца.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
let date = Date()

//Today date
let dateString = dateFormatter.string(from: date)
print(dateString)

//Yesterday
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: date)!
print(dateFormatter.string(from: yesterday))

//This week
let startWeek = date.startOfWeek
let endWeek = date.endOfWeek
print(startWeek ?? "not found start date")
print(endWeek ?? "not found end date")

extension Date {//Get this week starts from monday
var startOfWeek: Date? {
    let gregorian = Calendar(identifier: .gregorian)
    guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
    return gregorian.date(byAdding: .day, value: 2, to: sunday)
}

var endOfWeek: Date? {
    let gregorian = Calendar(identifier: .gregorian)
    guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
    return gregorian.date(byAdding: .day, value: 8, to: sunday)
}

}

//This month
dateFormatter.dateFormat = "MM-yyyy"
let nameOfMonth = dateFormatter.string(from: date)
print(nameOfMonth)

//Last 30days
let last30Days = Calendar.current.date(byAdding: .day, value: -30, to: date)!
print(dateFormatter.string(from: last30Days))

Мне нужна дата начала и окончания последней недели [День начала - понедельник, а день окончания - воскресенье]

И дата начала и окончания последнего месяца

1 Ответ

1 голос
/ 10 апреля 2019

Вы должны использовать эту функцию для вычисления диапазона дат, она принимает целевую дату, компонент календаря и два входных параметра, которые будут заполнены вычисленным интервалом даты и времени.

func dateInterval(of component: Calendar.Component, start: inout Date, interval: inout TimeInterval, for date: Date) -> Bool

Вот пример:

let calendar = Calendar.current
let today = Date()

let lastWeek = calendar.date(byAdding: .weekOfYear, value: -1, to: today)
let lastMonth = calendar.date(byAdding: .month, value: -1, to: today)

if let lastWeek = lastWeek {
    var startOfLastWeek = Date()
    var interval = TimeInterval(0)

    calendar.dateInterval(of: .weekOfYear, start: &startOfLastWeek, interval: &interval, for: lastWeek)

    let endOfLastWeek = startOfLastWeek.addingTimeInterval(interval)

    print(startOfLastWeek)
    print(endOfLastWeek)
}

if let lastMonth = lastMonth {
    var startOfLastMonth = Date()
    var interval = TimeInterval(0)

    calendar.dateInterval(of: .month, start: &startOfLastMonth, interval: &interval, for: lastMonth)

    let endOfLastMonth = startOfLastMonth.addingTimeInterval(interval)

    print(startOfLastMonth)
    print(endOfLastMonth)
}

Если вам нужно изменить первый день недели, вы можете изменить его в своем календаре следующим образом:

var calendar = Calendar.current
calendar.firstWeekday = 2 // 1 is Sunday, 2 is Monday

Помните, чтокогда вы печатаете дату print(startOfLastMonth), она отображается в UTC, если вы хотите, чтобы дата печаталась в вашем часовом поясе, вам придется использовать DateFormatter .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...