Как переформатировать дату только в год, месяц и день?стриж - PullRequest
0 голосов
/ 13 мая 2019

У меня проблемы с переформатированием даты, чтобы показывать только .year .month и .day.Выходные данные - это та же строка, которую я ввожу, но с hour и minutes, показывающими нули, и моя цель - получить только строку "yyyy-MM-dd", поскольку я буду использовать ее для получения CoreData для записей.Если я использую этот формат даты, Xcode падает, потому что формат входящей даты - "yyyy-MM-dd HH:mm:ssZZZZ".Я следовал предложенному решению из Преобразовать строку в дату в Swift , но в некоторых случаях не работает.Как можно переформатировать дату?Как всегда большое спасибо.Вот функция:

func fetchBookings(date : String ) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ssZZZZ"
//        dateFormatter.dateFormat = "yyyy-MM-dd"
        let dateFormatted = dateFormatter.date(from:date)!

        let calendar = Calendar.current
        let components = (calendar as NSCalendar).components([.year, .month,.day] , from: dateFormatted)
        let dateToCheck = calendar.date(from: components)
        let context =  CoreData.databaseContext
        let fetchRequest = NSFetchRequest<Booking>(entityName: "Booking")
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "bookingDate", ascending: true)]

        let userPredicate = NSPredicate(format: "user.name == %@", UserDetails.fullName ?? "")
        let datePredicate = NSPredicate(format: "bookingDate CONTAINS %@", dateToCheck! as CVarArg)
        let andPredicate = NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.and, subpredicates: [userPredicate, datePredicate])
        fetchRequest.predicate = andPredicate
        fetchedResultController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        do {
            try fetchedResultController.performFetch()
            print("##################### selectedDate in fetchBooking() is :\(self.selectedDate) ")
            print(" bookings fetched")
            print("booking date is: \(date)")
            print("dateTocheck is: \(String(describing: dateToCheck!))")
            print("today date is : \(Date())")
            print("fetched objects are: \(String(describing: fetchedResultController.fetchedObjects))")
        } catch  {
            print("Error fetching bookings :\(error)" )
        }
    }

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Просто создайте String расширение и

1. конвертируйте String в Date с форматом yyyy-MM-dd HH:mm:ssZZZZ

2. преобразование Date в String с форматом yyyy-MM-dd

extension String {
    var formattedDate: String? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ssZZZZ"
        if let date = dateFormatter.date(from: self) {
            print(date)
            dateFormatter.dateFormat = "yyyy-MM-dd"
            return dateFormatter.string(from: date)
        }
        return nil
    }
}

Пример:

let dateStr = "2017-04-10 10:33:42GMT"
let formattedDate = dateStr.formattedDate //Output: "2017-04-10"
0 голосов
/ 13 мая 2019

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

let dateStr = self.convertDateFormaterCommon(currentFormat: "yyyy-MM-dd HH:mm:ss", reqdFormat: "dd MMM, yyyy", dateStr: myObj.transferDate ?? "")

func convertDateFormaterCommon(currentFormat:String, reqdFormat:String, dateStr: String) -> String
{
    if dateStr != ""{
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = currentFormat
        dateFormatter.locale = Locale(identifier: "en_US")
        let date = dateFormatter.date(from: dateStr)
        dateFormatter.dateFormat = reqdFormat
        return  dateFormatter.string(from: date ?? Date())
    }
    return ""
}
0 голосов
/ 13 мая 2019
func getDateWithoutTime(string: String) -> String? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ssZZZZ"
    if let date = dateFormatter.date(from: string) {
        dateFormatter.dateFormat = "yyyy-MM-dd"
        return dateFormatter.string(from: date)
    }
    return nil
}
print(getDateWithoutTime1(string:"2019-05-13 12:27:53GMT"))   

2019-05-13

...