0

Below code works fine on iOS devices and watchOS simulator.

static func getEventDateTime(startDateTime: Date?) -> String {
    if let startDateTime = startDateTime {
        let startTimeInMillis = Int(startDateTime.timeIntervalSince1970 * 1000)
        let fiveMinutesInMillis = 300000
        let eventStartDateTime = Date(timeIntervalSince1970: TimeInterval((startTimeInMillis-fiveMinutesInMillis)/1000))

        return convertDateToString(eventStartDateTime)
    }
    
    return ""
}

However when I run it on Apple Watch Series 3, I get the following error: double value cannot be converted to int because the result would be greater than int.max on line let startTimeInMillis = Int(startDateTime.timeIntervalSince1970 * 1000).

So I changed let startTimeInMillis = Int(startDateTime.timeIntervalSince1970 * 1000) to let startTimeInMillis = Int64(startDateTime.timeIntervalSince1970 * 1000)

and

let eventStartDateTime = Date(timeIntervalSince1970: TimeInterval((startTimeInMillis-fiveMinutesInMillis)/1000)) to let eventStartDateTime = Date(timeIntervalSince1970: TimeInterval((Int(startTimeInMillis)-fiveMinutesInMillis)/1000)).

Now I am getting following error: Not enough bits to represent the passed value on line let eventStartDateTime = Date(timeIntervalSince1970: TimeInterval((Int(startTimeInMillis)-fiveMinutesInMillis)/1000))

How do I change the function to make it work on Apple Watch Series 3 or watchOS 7?

Updated function code:

  static func getEventDateTime(startDateTime: Date?) -> String {
    if let startDateTime = startDateTime {
        let startTimeInMillis = Int64(startDateTime.timeIntervalSince1970 * 1000)
        let fiveMinutesInMillis = 300000
        let eventStartDateTime = Date(timeIntervalSince1970: TimeInterval((Int(startTimeInMillis)-fiveMinutesInMillis)/1000))

        return convertDateToString(eventStartDateTime)
    }
    
    return ""
}
tech_human
  • 6,592
  • 16
  • 65
  • 107
  • Watch 3 has a 32 bit architecture. Is `timeIntervalSinceReferenceDate` (01.01.2001) instead of `timeIntervalSince1970` (01.01.1970) a solution? Or maybe the `Decimal` type is an option. – vadian Jul 20 '22 at 06:57
  • Do you need to use millisecond precision? – Paulw11 Jul 20 '22 at 07:00

1 Answers1

0

Use the Calendar API to add/subtract time units (doesn't support milliseconds, but does support nanoseconds, which can be converted from): https://developer.apple.com/documentation/foundation/calendar.

func getEventDateTimeCal(startDateTime: Date?) -> String {
  if let startDateTime = startDateTime,
     let date = Calendar.current.date(byAdding: .minute, value: -5, to: startDateTime) {
    return convertDateToString(date, startDateTime)
  }
  return ""
}

But also, if you don't need millisecond precision, subtract seconds from TimeInterval. Note that TimeInterval is typealias TimeInterval = Double and always represents seconds.

func getEventDateTime(startDateTime: Date?) -> String {
  if let startDateTime = startDateTime {
    let fiveMinutesInSeconds = 5.0 * 60
    let eventStartDateTime = Date(timeIntervalSince1970: startDateTime.timeIntervalSince1970 - fiveMinutesInSeconds)

    return convertDateToString(startDateTime, eventStartDateTime)
  }

  return ""
}
mani
  • 3,068
  • 2
  • 14
  • 25