首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftDate与数据计算

SwiftDate与数据计算
EN

Stack Overflow用户
提问于 2018-01-10 21:24:36
回答 2查看 378关注 0票数 1

我在计算宠物活着的时间和时间。我用的是SwiftDate。因此,我让用户选择一个生日,并将其与当前日期进行比较。

我不想比较时间..。因此,出生日期和当前日期都应该有相同的时间。

我的代码是:

代码语言:javascript
复制
let greg = Calendar(identifier: .gregorian)
var date1 = birthday // from datepicker
var date2 = Date()
var components1 = greg.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date1)
var components2 = greg.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date2)
components1.hour = 15
components1.minute = 0
components1.second = 0
components2.hour = 15
components2.minute = 0
components2.second = 0
date1 = greg.date(from: components1)!
date2 = greg.date(from: components2)!

let daysAlive = (date2 - date1).in(.day)
let weeksAlive = Int(weeksAlive! / 7)
let restDays = daysAlive! - (weeksAlive * 7)
let aLive = "Age: \(weeksAlive) wk, \(restDays) d (\(daysAlive!) d)"

产出为“年龄: 28周,3天(199天)”

密码有效..。但我怎么能重构它呢?有什么更简单的方法来为两个给定的日期设定“同一时间”呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-10 21:40:48

忽略时间,只需省略.hour.minute.second的组件

代码语言:javascript
复制
let components1 = greg.dateComponents([.year, .month, .day], from: date1)
let components2 = greg.dateComponents([.year, .month, .day], from: date2)

date1 = greg.date(from: components1)!
date2 = greg.date(from: components2)!

这是一个更简单的解决方案,没有任何第三方库。它计算weekOfMonthday的差异一次,用Calendar方法dateComponents(:from:to:计算day的差异一次。不需要额外的数学。

代码语言:javascript
复制
let greg = Calendar(identifier: .gregorian)
var date1 = greg.date(from: DateComponents(year: 2017, month: 6, day: 25))!
var date2 = Date()
var components1 = greg.dateComponents([.year, .month, .day], from: date1)
var components2 = greg.dateComponents([.year, .month, .day], from: date2)

let weeksAndDays = greg.dateComponents([.weekOfMonth, .day], from: components1, to: components2)
let justDays = greg.dateComponents([.day], from: components1, to: components2)

let aLive = "Age: \(weeksAndDays.weekOfMonth!) wk, \(weeksAndDays.day!) d (\(justDays.day!) d)"
// "Age: 28 wk, 3 d (199 d)"
票数 2
EN

Stack Overflow用户

发布于 2018-01-10 21:40:24

如果你不关心时差,为什么不把时间完全排除在外呢?它将为您提供相同的输出,并且只会使您避免输入缺省时间值,然后对函数的其余部分忽略它们:

代码语言:javascript
复制
let greg = Calendar(identifier: .gregorian)
var date1 = birthday // from datepicker
var date2 = Date()
var components1 = greg.dateComponents([.year, .month, .day], from: date1)
var components2 = greg.dateComponents([.year, .month, .day], from: date2)
date1 = greg.date(from: components1)!
date2 = greg.date(from: components2)!

let daysAlive = (date2 - date1).in(.day)
let weeksAlive = Int(weeksAlive! / 7)
let restDays = daysAlive! - (weeksAlive * 7)
let aLive = "Age: \(weeksAlive) wk, \(restDays) d (\(daysAlive!) d)"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48196304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档