2

I want to get full date with time like my below code,

func findDate(date: Date)
{
        let format1: DateFormatter = DateFormatter()
        format1.dateFormat = "yyyy-MM-dd"
        let onlyDate = format1.string(from: date) // Here date is like 2019-11-21 

        let dateStr = "\(onlyDate) 10:00 AM"
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm a"
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        dateFormatter.calendar = NSCalendar.current
        dateFormatter.timeZone = TimeZone.current

        let newDate = dateFormatter.date(from: dateStr)
        print(newDate) // It returns nil

        dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
        let newDateStrInUTC = dateFormatter.string(from: newDate ?? Date()) // Not proper due to newDate = nil
}

In findDate function date argument has date like 2019-11-21 18:30:00 +0000. I want to add my custom time (10:00 AM) in that date.

I received this date (2019-11-21 18:30:00 +0000) from FSCalender.

I want Output like this 2019-11-21 12:00 PM

Komal Goyani
  • 779
  • 6
  • 25

3 Answers3

2

Try this code. It will change time components without changing date.

func findDate(date: Date)
{
    let calendar = Calendar.current
    let timeString = "10:00 AM"
    let formatter = DateFormatter()
    formatter.dateFormat = "hh:mm a"
    let customDate = formatter.date(from: timeString)
    let hour = calendar.component(.hour, from: customDate!)
    let min = calendar.component(.minute, from: customDate!)
    let sec = calendar.component(.second, from: customDate!)
    let resultDate = Calendar.current.date(bySettingHour: hour, minute: min, second: sec, of: date)
    print(resultDate!)
}

Now you can use resultDate according to your requirement. Also take care of those optionals according to your need.

Fahad Masood
  • 121
  • 7
  • I have time string like "10:00 AM". If i want to set time component as per your answer then i have to separate hour & minute from time string and i have to set 24 hour time formate but i have AM, PM formate. For this i have to write some messy code. I want simple way to get full date with time. @Fahad Masood. – Komal Goyani Nov 23 '19 at 04:22
1

Try this below:

let dateTimeToConvert = yourDateTimeHere
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_EN")
formatter.timeZone = TimeZone.current
formatter.dateFormat = "YYYY-MM-dd HH:mm a"
formatter.amSymbol = "AM"
formatter.pmSymbol = "PM"
let converted = formatter.date(from: "\(dateTimeToConvert)")
print(converted)

Note, the locale I have used is different, simply use yours. I have also used a date time to convert with this. But you can achieve what you want by simply adding the time in after date conversion.

You can also mess around with the date time structure like so

format = "HH:mm: a 'on' MMMM dd, yyyy"

this format when used will like like this

"9:01 am on January 12, 2019"

Julian Silvestri
  • 1,970
  • 1
  • 15
  • 33
1

The problem is with the following line in findDate(date: Date) function.

dateFormatter.dateFormat = "yyyy-MM-dd HH:mm a"

Replace it to following, and your function should start working as expected.

dateFormatter.dateFormat = "yyyy-MM-dd hh:mm a"

Explanation:

HH is used for setting date to 24 Hours format.

Use small hh, if you wanted to show date in 12 Hours format with AM/PM

As you are appending 10:00 AM to your onlyDate String. You should use hh:mm a for proper conversion from String to Date.

Hope it helps.

Bhavin Kansagara
  • 2,866
  • 1
  • 16
  • 20