Присвоение NSDateComponents метке - PullRequest
0 голосов
/ 19 января 2019

Я создаю мобильное приложение с обратным отсчетом до определенной даты. Я думаю, что у меня есть сам таймер, но я изо всех сил пытаюсь перевести его в формат, в котором я могу назначить его своему лейблу. Я получаю сообщение об ошибке "Невозможно вызвать инициализатор для типа 'String' со списком аргументов типа" (NSDateComponents) ". Эта ошибка находится в строке" var date = String (opensGavelDate) ". Выход для метки имеет был правильно создан в этом файле.

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

func createGavelTimer() {
    let openingGavelDate = NSDateComponents()
    openingGavelDate.year = 2019
    openingGavelDate.month = 7
    openingGavelDate.day = 16
    openingGavelDate.hour = 14
    openingGavelDate.minute = 00
    openingGavelDate.timeZone = NSTimeZone(abbreviation: "CST")! as TimeZone
    var date = String(openingGavelDate) //problem is here
    countdownLabel.text = date
}

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Две вещи, которые вам нужно сделать, чтобы сформировать дату:

  1. Установить календарь в экземпляре DateComponents.
  2. Получите дату, открыв свойство date в экземпляре DateComponents.

Кроме того, я бы рекомендовал использовать идентификаторы часовых поясов вместо сокращений для указания часового пояса; Преимущество состоит в том, что идентификаторы автоматически применяют специальные правила, такие как переход на летнее время. (Ниже я заменил UTC зоной "Америка / Чикаго".)

Попробуйте этот код на детской площадке:

var openingGavelDate = DateComponents()
let timeZone = TimeZone(identifier: "America/Chicago")!
openingGavelDate.year = 2019
openingGavelDate.month = 7
openingGavelDate.day = 16
openingGavelDate.hour = 14
openingGavelDate.minute = 00
openingGavelDate.calendar = Calendar.current
openingGavelDate.timeZone = timeZone
let date = openingGavelDate.date
print(date ?? "no date")

Вывод: 2019-07-16 19:00:00 +0000 (ваша дата в GMT.)

Это даст вам дату, но обратите внимание, что класс Date печатается в GMT по умолчанию, поскольку Date не имеет понятия о часовом поясе.

Чтобы напечатать date в нужном часовом поясе и формате, используйте DateFormatter:

let f = DateFormatter()
f.dateFormat = "yyyy-MM-dd hh:mm a"
f.timeZone = TimeZone(identifier: "America/Chicago")!
print(f.string(from: date!))

Вывод: 2019-07-16 02:00 PM (ваша дата и время, в CST и отформатированы для чтения.)

DateFormatter позволяет вам самостоятельно управлять форматом или следовать системным настройкам пользователя, чтобы определить, что находится в последней строке. См. Документы для DateFormatter, чтобы узнать, как перевести его в формат, который вы хотите отобразить.

0 голосов
/ 20 января 2019

Одно из возможных решений:

let date = Calendar.current.date(from: openingGavelDate)

let dateFormatter = DateFormatter()
    dateFormatter.timeStyle = .short
    dateFormatter.dateStyle = .medium
    dateFormatter.doesRelativeDateFormatting = true
    dateFormatter.timeZone = TimeZone(abbreviation: "CST")!


    let yourString = dateFormatter.string(from: date)
0 голосов
/ 19 января 2019

Попробуйте преобразовать объект NSDateComponents в Date, используя Calendar.date(from:), а затем преобразовать его в String, используяDateFormatter:

let gregorianCalendar = Calendar(identifier: .gregorian)

if let date = gregorianCalendar.date(from: openingGavelDate as DateComponents) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    dateFormatter.timeStyle = .none

    countdownLabel.text = dateFormatter.string(from: date)
}

Кроме того, как прокомментировали @Sh_Khan и @rmaddy, вы должны использовать DateComponents, TimeZone и т. Д. Вместо их NSаналоги (если вы не используете Swift 2 или ниже).

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