Search code examples
iosswiftcocoa-touchnsdatensdateformatter

Getting wrong output from DateFormatter


I'm getting last week dates from below code, week starts with Saturday. It's getting dates(2019-04-27 18:30:00 +0000, 019-05-04 18:30:00 +0000), but when i try to set DateFormatter it's getting dates(28-04-2019 00:00:00, 05-05-2019 00:00:00). I want week starts with with Monday in india local time & date.

var dateFormatter:DateFormatter!
var date:Date!

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

var calendar = Calendar.current
calendar.firstWeekday = 2 // 1 is Sunday, 2 is Monday
let lastWeek = calendar.date(byAdding: .weekOfYear, value: -1, to: Date())
if let lastWeek = lastWeek {
var startOfLastWeek = Date()
var interval = TimeInterval(0)

_ = Calendar.current.dateInterval(of: .weekOfYear, start: &startOfLastWeek, interval: &interval, for: lastWeek)
let endOfLastWeek = startOfLastWeek.addingTimeInterval(interval)
print(startOfLastWeek)//2019-04-27 18:30:00 +0000
print(endOfLastWeek)//019-05-04 18:30:00 +0000

let startWeekString = dateFormatter.string(from: startOfLastWeek)
let endWeekString = dateFormatter.string(from: endOfLastWeek)
print(startWeekString)//28-04-2019 00:00:00
print(endWeekString)//05-05-2019 00:00:00

Solution

  • The Date is always in UTC in any programming language, It does't have time zones. And DateFormatter is used to show Date in local/localised format by providing timezones.

    The Date Formatter allow you to convert it to string that is human readable. In phones:

    1. If you have central server/DB then you should save you Dates in UTC.
    2. when time to show on your phone, convert UTC to local using time zone.

    DO NOT TRY TO OVERCOMPLICATE IT.

    Use below code to find Monday and Sunday of last week:

    var date:Date!
    
    dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
    dateFormatter.timeZone=TimeZone.current
    TimeZone.current
    date = Date()
    
    var calendar = Calendar.current
    calendar.firstWeekday = 2 // 1 is Sunday, 2 is Monday
    let lastWeek = calendar.date(byAdding: .weekOfYear, value: -1, to: Date())
    if let lastWeek = lastWeek {
     var startOfLastWeek = Date()
     var interval = TimeInterval(0)
    
     _ = Calendar.current.dateInterval(of: .weekOfYear, start: &startOfLastWeek, interval: &interval, for: lastWeek)
     startOfLastWeek = calendar.date(byAdding: .weekday, value: 1, to: startOfLastWeek)!
     print(interval)
     interval = interval - 1
     let endOfLastWeek = startOfLastWeek.addingTimeInterval(interval)
     print(startOfLastWeek)//2019-04-27 18:30:00 +0000
     print(endOfLastWeek)//019-05-04 18:30:00 +0000
    
     let startWeekString = dateFormatter.string(from: startOfLastWeek)
     let endWeekString = dateFormatter.string(from: endOfLastWeek)
     print(startWeekString)//28-04-2019 00:00:00
     print(endWeekString)//05-05-2019 00:00:00
    }