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

用户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 条评论
登录 后参与评论

相关文章

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

SQL Server:创建新列,该列是从今天的日期中减去日期列

几天后如何查找日期

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

从今天算起减去7天

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

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

从今天开始到目标日期之间如何循环几天

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

R从今天的日期减去1个月得出NA

从今天开始输出几天

几天后,如何在PHP中找到将来的日期?

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

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

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

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

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

如何从今天开始减去n个工作日以获取用户提示的过去日期?

从今天到之后的7天之间的SQL日期

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

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

SQL从今天开始按日期选择

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

MongoDB连接几天后关闭

几天后运行,Android代码错误

几天后PFUser currentUser返回null

几天后每天更改颜色FULLCALENDAR

从今天开始减去熊猫数据框的值

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

TOP 榜单

热门标签

归档