0

In my android app I use the following code to get a string that converts a date to readable sentence (se below image). Is there any way to do this is swift 4.2?

 private String getDate(String d) {

    String datemobile = "";
    try {
        String section1 = null;
        String mydateStr = null;
        DateFormat df1 = null;
        PrettyTime p = new PrettyTime();
        Date date = null;

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        df1 = new SimpleDateFormat("EEE, d MMM yyyy ");
        date = df.parse(d);
        mydateStr = df1.format(date);


        datemobile = p.format(date) + " on " + mydateStr;
        return datemobile;

    } catch (Exception e) {
        e.printStackTrace();

        return datemobile;
    }
}

enter image description here

user1163234
  • 2,407
  • 6
  • 35
  • 63
  • There is no public api by apple for it. May be you can calculate it yourself. Try [this](https://stackoverflow.com/a/27184261/4061501) – Lal Krishna Feb 19 '19 at 05:16
  • 1
    Well [there's this](https://github.com/malcommac/SwiftDate#8) (dig for it), [there's also this](https://github.com/akosma/SwiftMoment), it mentions formatting, but I didn't see an example – MadProgrammer Feb 19 '19 at 05:19

2 Answers2

0

Try this ,

    let startDateString = "03/01/2019" // start date
    let endDateString = "15/03/2019" // end date

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"

    let startDate = dateFormatter.date(from: startDateString)
    let endDate = dateFormatter.date(from: endDateString)

    let gregorian = NSCalendar(calendarIdentifier:NSCalendar.Identifier.gregorian)

    let c2 = gregorian?.components([.minute, .hour, .weekOfMonth , .day, .month, .year], from: startDate!, to: endDate!, options: .matchFirst)
    print(c2)

Reference : https://developer.apple.com/documentation/foundation/nscalendar/unit

Output:

enter image description here

dahiya_boy
  • 9,298
  • 1
  • 30
  • 51
0

Found THIS but it's for past dates so I have updated it for future dates as per your requirement.

Check below example:

//Future date
let date1 = DateComponents(calendar: .current, year: 2019, month: 3, day: 20, hour: 5, minute: 9).date!

extension Date {

    func futureDateDisplay() -> String {

        let calendar = Calendar.current
        let minutesUntil = calendar.date(byAdding: .minute, value: 1, to: Date())!
        let hourUntil = calendar.date(byAdding: .hour, value: 1, to: Date())!
        let dayUntil = calendar.date(byAdding: .day, value: 1, to: Date())!
        let weekUntil = calendar.date(byAdding: .day, value: 7, to: Date())!

        if minutesUntil > self {
            let diff = Calendar.current.dateComponents([.second], from: Date(), to: self).second ?? 0
            return "\(diff) sec from now on"
        } else if hourUntil > self {
            let diff = Calendar.current.dateComponents([.minute], from: Date(), to: self).minute ?? 0
            return "\(diff) min from now on"
        } else if dayUntil > self {
            let diff = Calendar.current.dateComponents([.hour], from: Date(), to: self).hour ?? 0
            return "\(diff) hrs from now on"
        } else if weekUntil > self {
            let diff = Calendar.current.dateComponents([.day], from: Date(), to: self).day ?? 0
            return "\(diff) days from now on"
        }
        let diff = Calendar.current.dateComponents([.weekOfYear], from: Date(), to: self).weekOfYear ?? 0
        return "\(diff) weeks from now on"
    }
}

And you can use it like:

date1.futureDateDisplay() //4 weeks from now on

Or here is the sort solution for that:

let date1 = DateComponents(calendar: .current, year: 2019, month: 3, day: 20, hour: 5, minute: 9).date!

extension Date {

    func futureDateDisplay() -> String {

        let remainingTime = DateComponentsFormatter()
        let calendar = Calendar.current
        remainingTime.calendar = calendar
        remainingTime.unitsStyle = .full
        remainingTime.allowedUnits = [.month,.weekOfMonth, .day, .hour, .minute, .second]
        remainingTime.maximumUnitCount = 1
        return remainingTime.string(from: Date(), to: self)!
    }
}

date1.futureDateDisplay() // 1 month, 1 day
Dharmesh Kheni
  • 71,228
  • 33
  • 160
  • 165