从今天的日期中减去几周和几天后的小时剩余时间

用户1951992

关于这个老问题

从今天的日期减去几周和几天后,我不确定为什么还有一个小时的剩余时间。

dump(Date().xWeeks(-13).xDays(-2).elapsedDescription)

extension Date {

    /// Returns a new date that is 'x' number of days hence the recevier.
    public func xDays(_ x:Int) -> Date {
        return Calendar.current.date(byAdding: .day, value: x, to: self)!
    }

    /// Returns a new date that is 'x' number of weeks (of year) hence the recevier.
    public func xWeeks(_ x:Int) -> Date {
        return Calendar.current.date(byAdding: .weekOfYear, value: x, to: self)!
    }

    /// The count of hours hence the receiver. Today's date is established using the device clock.
    public func elapsedHours(toDate: Date) -> Int{
        return Calendar.current.dateComponents([.hour], from: self, to: toDate).hour!
    }

    /// The count of days hence the receiver. Today's date is established using the device clock.
    public func elapsedDays(toDate: Date) -> Int{
        return Calendar.current.dateComponents([.day], from: self, to: toDate).day!
    }

    /// The count of weeks hence the receiver. Today's date is established using the device clock.
    public func elapsedWeeks(toDate: Date) -> Int{
        return Calendar.current.dateComponents([.weekOfYear], from: self, to: toDate).weekOfYear!
    }

    public var elapsedDescription: String {
        let toDate = Date()
        let weekValue = elapsedWeeks(toDate: toDate) == 1 ? "week" : "weeks"
        if elapsedWeeks(toDate: toDate) > 0 {
            let dayRemainder = elapsedDays(toDate: toDate)-elapsedWeeks(toDate: toDate)*7
            if dayRemainder > 0 {
                let dayValue = dayRemainder == 1 ? "day" : "days"
                let remainingHours = elapsedHours(toDate: toDate)-elapsedWeeks(toDate: toDate)*7*24 - (dayRemainder*24)
                if remainingHours > 0 {
                    let hourValue = remainingHours == 1 ? "hour" : "hours"
                    return "\(elapsedWeeks(toDate: toDate)) \(weekValue), \(dayRemainder) \(dayValue) and \(remainingHours) \(hourValue)"
                } else {
                    return "\(elapsedWeeks(toDate: toDate)) \(weekValue) and \(dayRemainder) \(dayValue)"
                }
            } else {
                return "\(elapsedWeeks(toDate: toDate)) \(weekValue)"
            }
        } else if elapsedHours(toDate: toDate) > 0 {
            let hourValue = elapsedHours(toDate: toDate) == 1 ? "hour" : "hours"
            return "\(elapsedHours(toDate: toDate)) \(hourValue)"
        } else {
            return ""
        }
    }

}
马丁·R

您的代码假定一天有24小时,但情况并非总是如此。在具有夏令时的区域中,将时钟向前或向后调整时,一天可以有23或25个小时。

在伦敦,夏令时结束于10月30日,这意味着那天有25个小时。这说明了输出中的额外小时。

正确的解决方案很简单:只需一步就可以计算出数周,数天和数小时之间的差异:

let comps = Calendar.current.dateComponents([.weekOfYear, .day, .hour],
                                            from: self, to: toDate)

然后从创建所需的输出字符串

comps.weekOfYear!, comps.day!, comps.hour!

在您的示例中,dump(comps)显示

▿天:6小时:0 weekOfYear:13 isLeapMonth:false-
  天:6-
  小时:0 
  -weekOfYear:13 
  -isLeapMonth:false

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将随机时间戳记附加到日期字段,同时从今天的日期中减去天数?

来自分类Dev

几天后如何查找日期

来自分类Dev

使用datePicker4.4从今天起7天后禁用日期

来自分类Dev

从今天算起减去7天

来自分类Dev

Power Query过滤日期从今天开始减去?到今天

来自分类Dev

如何根据包含日期的列计算从今天起的几天

来自分类Dev

Linq查询如何从今天的日期中选择上一周的数据

来自分类Dev

从今天的日期减去一个特定的日期将返回3天以上

来自分类Dev

如何使用oracle查询仅从今天的日期中获取以前日期中不存在的数据

来自分类Dev

如何将字符串(例如:“ 8/31/2020”)转换为日期,并从今天的日期中减去该字符串,以查找JavaScript中已过去的天数

来自分类Dev

将剩余时间转换为实际日期和时间

来自分类Dev

固定在Swift / UIKit中设置从今天开始的日期或时间

来自分类Dev

从今天开始计算过去一段时间的日期

来自分类Dev

从今天开始的PHP DateTime和时间戳不相同

来自分类Dev

jQuery-计算从今天起5年的日期和月份

来自分类Dev

R - 从日期中减去小时

来自分类Dev

JavaScript计算日期从今天到前7天

来自分类Dev

PHP的日期从今天到4个月

来自分类Dev

JavaScript计算日期从今天到前7天

来自分类Dev

在Excel中从今天的日期开始更新表

来自分类Dev

如何使用时间从今天开始获取下个月的日期

来自分类Dev

用Javascript从今天的日期和固定年龄计算出虚构的出生日期

来自分类Dev

MongoDB连接几天后关闭

来自分类Dev

几天后PFUser currentUser返回null

来自分类Dev

几天后每天更改颜色FULLCALENDAR

来自分类Dev

减去剩余时间并在VBA中比较数字

来自分类Dev

根据当前日期时间和LastLockoutDate显示用户解锁的剩余时间

来自分类Dev

根据当前日期时间和LastLockoutDate显示用户解锁的剩余时间

来自分类Dev

从PHP中的日期中减去几个小时

Related 相关文章

  1. 1

    将随机时间戳记附加到日期字段,同时从今天的日期中减去天数?

  2. 2

    几天后如何查找日期

  3. 3

    使用datePicker4.4从今天起7天后禁用日期

  4. 4

    从今天算起减去7天

  5. 5

    Power Query过滤日期从今天开始减去?到今天

  6. 6

    如何根据包含日期的列计算从今天起的几天

  7. 7

    Linq查询如何从今天的日期中选择上一周的数据

  8. 8

    从今天的日期减去一个特定的日期将返回3天以上

  9. 9

    如何使用oracle查询仅从今天的日期中获取以前日期中不存在的数据

  10. 10

    如何将字符串(例如:“ 8/31/2020”)转换为日期,并从今天的日期中减去该字符串,以查找JavaScript中已过去的天数

  11. 11

    将剩余时间转换为实际日期和时间

  12. 12

    固定在Swift / UIKit中设置从今天开始的日期或时间

  13. 13

    从今天开始计算过去一段时间的日期

  14. 14

    从今天开始的PHP DateTime和时间戳不相同

  15. 15

    jQuery-计算从今天起5年的日期和月份

  16. 16

    R - 从日期中减去小时

  17. 17

    JavaScript计算日期从今天到前7天

  18. 18

    PHP的日期从今天到4个月

  19. 19

    JavaScript计算日期从今天到前7天

  20. 20

    在Excel中从今天的日期开始更新表

  21. 21

    如何使用时间从今天开始获取下个月的日期

  22. 22

    用Javascript从今天的日期和固定年龄计算出虚构的出生日期

  23. 23

    MongoDB连接几天后关闭

  24. 24

    几天后PFUser currentUser返回null

  25. 25

    几天后每天更改颜色FULLCALENDAR

  26. 26

    减去剩余时间并在VBA中比较数字

  27. 27

    根据当前日期时间和LastLockoutDate显示用户解锁的剩余时间

  28. 28

    根据当前日期时间和LastLockoutDate显示用户解锁的剩余时间

  29. 29

    从PHP中的日期中减去几个小时

热门标签

归档