Неправильный вывод из DateFormatter - PullRequest
0 голосов
/ 10 мая 2019

Я получаю даты прошлой недели, указанные ниже, неделя начинается с субботы. Он получает даты (2019-04-27 18:30:00 +0000, 019-05-04 18:30:00 +0000), но когда я пытаюсь установить DateFormatter , он получает даты (28- 04-2019 00:00:00, 05-05-2019 00:00:00). Я хочу, чтобы неделя начиналась с понедельника по местному времени и дате в Индии.

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

1 Ответ

0 голосов
/ 10 мая 2019

Date всегда в UTC на любом языке программирования, он не имеет часовых поясов. И DateFormatter используется для отображения Date в локальном / локализованном формате путем предоставления часовых поясов.

Date Formatter позволяет вам преобразовать его в строку, удобную для чтения человеком. В телефонах:

  1. Если у вас есть центральный сервер / БД, вам следует сохранить даты в UTC.
  2. когда время показывать на вашем телефоне, конвертируйте UTC в местный, используя часовой пояс.

НЕ ПЫТАЙТЕСЬ ПРЕОДОЛЕТЬ ЕГО.

Используйте код ниже, чтобы найти понедельник и воскресенье прошлой недели:

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
}
...