【问题标题】:Calculate Difference Between Two Time Periods计算两个时间段之间的差异
【发布时间】:2021-08-03 03:27:41
【问题描述】:

1)。当我发送输入startTimeString = "10:00 pm"endTimeString = "4:00am" 时,答案应该是360 minutes

2)。当我发送输入startTimeString = "10:00 am"endTimeString = "6:00pm" 时,答案应该是480 minutes


这里是方法,这个方法失败了这个输入startTimeString = "10:00 pm"endTimeString = "4:00am"

    func differenceStartAndEndTime(startTimeString: String?, endTimeString: String?) -> Int {
       let dateFormatter = DateFormatter()
       dateFormatter.dateFormat = "hh:mm a"
       guard let startTime = dateFormatter.date(from: startTimeString ?? "0:00 am"), let endTime = dateFormatter.date(from: endTimeString ?? "0:00 am") else {
           return 0
       }
       let minutes = Int(endTime.timeIntervalSince(startTime) / 60)
       print("Here Is The Hours ~ \(minutes/60)")
       print("Here Is The Minutes ~ \(minutes%60)")

       return minutes > 0 ? minutes : 0
   }

【问题讨论】:

  • 您应该检查endTime 是否大于startTime。如果没有,请添加“1 天”。旁注,在大多数情况下添加 3600*24 可以,但它不干净,你不会有夏令时更改,因为一天不是 24 小时的必要...
  • 好的,谢谢提示

标签: swift nsdateformatter


【解决方案1】:

正如 cmets 中已经提到的,只需检查结束日期是否小于开始日期,如果为真,则在结束日期上添加一天。关于时区问题,只需确保将日期格式化程序的默认日期设置为当前日期。除了这些问题之外,您的方法会在您每次调用此属性时创建一个新的日期格式化程序。您可以避免将日期格式化程序声明为静态:

extension Formatter {
    static let time: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = .init(identifier: "en_US_POSIX")
        dateFormatter.dateFormat = "h:mm a"
        return dateFormatter
    }()
}

func differenceStartAndEndTime(start: String, end: String) -> Int {
    Formatter.time.defaultDate = Calendar.current.startOfDay(for: Date())
    guard let startTime = Formatter.time.date(from: start),
          var endTime = Formatter.time.date(from: end) else {
          return 0
    }
    if endTime < startTime {
        endTime = Calendar.current.date(byAdding: .day, value: 1, to: endTime)!
    }
    let minutes = Int(endTime.timeIntervalSince(startTime) / 60)
    print("Here Is The Hours:", minutes / 60)
    print("Here Is The Minutes:", minutes % 60)
    return minutes
}

differenceStartAndEndTime(start: "2:00 am", end: "6:00 am")  // 240
differenceStartAndEndTime(start: "10:00 pm", end: "4:00 am") // 360
differenceStartAndEndTime(start: "10:00 pm", end: "6:00 am") // 480

这将打印:

这里是营业时间:4
这是会议纪要:0
这是营业时间:6
这是会议纪要:0
这是营业时间:8
这是会议纪要:0

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2021-11-25
    • 2011-08-01
    相关资源
    最近更新 更多