Как иметь год обновления переменной даты в счетчике - PullRequest
2 голосов
/ 15 октября 2019

Я работаю над функцией печати времени до Рождества. Я выполнил это, однако функция будет рассчитывать только разницу между текущей датой и Рождеством текущего года. Как я могу обновить свою функцию, чтобы вычислить разницу между текущей датой и Рождеством каждого года?

Я попытался заменить значение года в моей константе endTime переменной, однако это приводит к ошибке.

import UIKit
let formatter = DateFormatter()

let userCalendar = Calendar.current

let requestedComponent: Set<Calendar.Component> = [
    .month,
    .day,
    .hour,
    .minute,
    .second
]

formatter.dateFormat = "MM/dd/yy hh:mm:ss a"

let startTime = Date()
let endTime = formatter.date(from: "12/25/19 12:00:00 a")
let timeDiff = userCalendar.dateComponents(requestedComponent, from: startTime, to: endTime!)

print(timeDiff)

Я в недоумении от простого решения проблемы, так как я новичок в swift и xcode.

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

Только пара строк неправильны:

let whatYear = 2021 // *
let formatter = DateFormatter()
let userCalendar = Calendar(identifier: .gregorian) // *
let requestedComponent: Set<Calendar.Component> = [
    .month,
    .day,
    .hour,
    .minute,
    .second
]
formatter.dateFormat = "MM/dd/yy hh:mm:ss a"
let startTime = Date()
let endTime = userCalendar.date(from: DateComponents(year:whatYear, month:12, day:25)) // *
let timeDiff = userCalendar.dateComponents(requestedComponent, from: startTime, to: endTime!)

print(timeDiff)

// month: 26 day: 9 hour: 14 minute: 14 second: 46 isLeapMonth: false 

0 голосов
/ 15 октября 2019

Вы можете извлечь год текущего года и использовать его в сочетании с 12-м месяцем и 25-м днем ​​для создания даты текущего года. Возможно, вам придется добавить один год, если мы находимся на последней неделе года.


extension Calendar {
    static let gregorian = Calendar(identifier: .gregorian)
}

extension Date {
    static var nextChristmas: Date {
        DateComponents(calendar: .gregorian,
                           year: Date().year + (Date().month == 12 && Date().day > 25 ? 1 : 0),
                          month: 12,
                            day: 25).date!
    }
    static var timeLeftTillChristmas: DateComponents { Calendar.gregorian.dateComponents([.day, .hour, .minute, .second], from: Date(), to:  Date.nextChristmas) }
    var year:  Int { Calendar.gregorian.component(.year, from: self) }
    var month: Int { Calendar.gregorian.component(.month, from: self) }
    var day:   Int { Calendar.gregorian.component(.day, from: self) }
}

Date.nextChristmas.description(with: .current)  // Wednesday, December 25, 2019 at 12:00:00 AM Brasilia Standard Time
Date.timeLeftTillChristmas  // day: 70 hour: 7 minute: 19 second: 34 
0 голосов
/ 15 октября 2019
let now: Date = Date()
var calendar: Calendar = Calendar(identifier: .gregorian)
let nyTimeZone: TimeZone = TimeZone(identifier: "America/New_York")!

let newYearsComponents: DateComponents = DateComponents(calendar: calendar, timeZone: nil, era: nil,
                                              year: nil, month: 1, day: 1,
                                              hour: 0, minute: 0, second: 0, nanosecond: 0,
                                              weekday: nil, weekdayOrdinal: nil, quarter: nil, weekOfMonth: nil, weekOfYear: nil, yearForWeekOfYear: nil)
let newYears: Date = calendar.nextDate(after: now, matching: newYearsComponents, matchingPolicy: .nextTime, repeatedTimePolicy: .first, direction: .forward)!

let units: Set<Calendar.Component> = Set(arrayLiteral: .month, .day, .hour, .minute, .second)
let timeLeftUntilNewYears: DateComponents = calendar.dateComponents(units, from: now, to: newYears)

источник: https://engineering.shopspring.com/manipulating-dates-and-time-zones-in-ios-development-2f0e0d0e93be

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