Преобразование даты из одного формата в другой - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь преобразовать дату из одного формата в другой. Но значение date в приведенном ниже коде равно нулю. Можете ли вы, ребята, помочь мне, ниже приведен код.

   func eventTimeDate() -> Date {
        let dtf = DateFormatter()
        dtf.timeZone = TimeZone.current
        dtf.dateFormat = "yyyy-MM-dd HH:mm:ss z" 

        /// "2020-05-28 00:20:00 GMT+5:30"   
        let stringDate = dtf.string(from: self)

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss z"

        /// nil
        let date = dateFormatter.date(from: stringDate)

        return date!
    }

Ответы [ 3 ]

0 голосов
/ 27 мая 2020

Быстрый класс Дата не имеет формата.

В вашем коде stringDate находится в формате «yyyy-MM-dd HH: mm: ss z» . Если вам нужно преобразовать String в Date , вы должны использовать тот же формат, иначе он вернет nil.

Если вы хотите изменить формат строки, сначала преобразуйте ее в Swift ' Date ', а затем снова преобразуйте ее в строку с использованием нового Formatter.

func eventTimeDate(dateString : String, currentFormat : String, newFormat : String) -> String? {
    let currentDateFormatter = DateFormatter()
    currentDateFormatter.calendar = Calendar(identifier: Calendar.Identifier.gregorian)
    currentDateFormatter.locale = Locale(identifier: "en_IN")
    currentDateFormatter.dateFormat = currentFormat
    let date = currentDateFormatter.date(from: dateString)

    let newDateFormatter = DateFormatter()
    newDateFormatter.calendar = Calendar(identifier: Calendar.Identifier.gregorian)
    newDateFormatter.locale = Locale(identifier: "en_IN")
    newDateFormatter.dateFormat = newFormat
    if let date = date {
        let newDateString = newDateFormatter.string(from: date)
        return newDateString
    }
    return nil
}
0 голосов
/ 27 мая 2020

В вашем коде три проблемы. Во-первых, при синтаксическом анализе фиксированного формата даты вы всегда должны устанавливать локаль средства форматирования даты на "en_US_POSIX". Во-вторых, вам нужно избежать GMT вашей строки даты. И последнее, но не менее важное: вам нужно исправить строку часового пояса, в которой отсутствует начальный ноль для вашего часа часового пояса:

let dateStr = "2020-05-28 00:20:00 GMT+5:30"
let formatter = DateFormatter()
// set the date formatter's locale to "en_US_POSIX"
formatter.locale = .init(identifier: "en_US_POSIX")
// escape the GMT of your date string
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss 'GMT'Z"
// add the leading zero for your timezone hour
let string = dateStr.replacingOccurrences(of: "(GMT[+-])(\\d:)", with: "$10$2", options: .regularExpression)
if let date = formatter.date(from: string) {
    print(date)  // "2020-05-27 18:50:00 +0000\n"
}
0 голосов
/ 27 мая 2020

Если вам нужно преобразовать из одной форматированной строки даты в другую форматированную строку даты, вы можете использовать два DateFormatter s: один - средство форматирования ввода для преобразования строки в промежуточный объект Date, а затем - с помощью модуль форматирования вывода - преобразование из Date в String.

func reFormat(from dateStr: String) -> String? {
  let fromFormatter = DateFormatter()
  fromFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss z"

  let toFormatter = DateFormatter()
  toFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss z"

  guard let date = fromFormatter.date(from: dateStr) else { return nil }

  return toFormatter.string(from: date)
}

Если вам просто нужно вернуть объект Date, тогда это более простая функция, использующая только один DateFormatter:

func toDate(from dateStr: String) -> Date? {
  let formatter = DateFormatter()
  formatter.dateFormat = "yyyy-MM-dd HH:mm:ss z"

  return formatter.date(from: dateStr)
}
* 1010 Сам объект *Date не имеет форматирования - это чистое представление даты и времени, которые вы можете преобразовать в / из различных форматеров.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...