Datetime Swift 3截短日期至日/月/年开始日期的简便方法

Datetime Swift 3截短日期至日/月/年开始日期的简便方法,datetime,swift3,Datetime,Swift3,有没有像在Oracle数据库中那样简单地截断日期的方法? 例如,我需要从午夜开始设置值。在Oracle中,我可以执行TRUNC(SYSDATE)。但在Swift中,我看不到类似的方法。 我检查了StackOverflow,看到了一些DateFormatter示例,以及将日期转换为字符串的日期组件。我也见过,但不知道如何处理Date(不是NSDate)类型,我 但我不需要字符串值。我希望避免转换为字符串并返回到日期。我只想得到三个值: 当前日期的开始(就像我们在Oracle中使用TRUNC(SYS

有没有像在Oracle数据库中那样简单地截断日期的方法? 例如,我需要从午夜开始设置值。在Oracle中,我可以执行TRUNC(SYSDATE)。但在Swift中,我看不到类似的方法。 我检查了StackOverflow,看到了一些DateFormatter示例,以及将日期转换为字符串的日期组件。我也见过,但不知道如何处理Date(不是NSDate)类型,我

但我不需要字符串值。我希望避免转换为字符串并返回到日期。我只想得到三个值:

当前日期的开始(就像我们在Oracle中使用TRUNC(SYSDATE)一样)

月初(就像我们在Oracle中使用TRUNC(SYSDATE,'month'))

年初(就像我们在Oracle中使用TRUNC(SYSDATE,年)一样)

我试过了,但它在午夜没有返回:

let comp: DateComponents = Calendar.current.dateComponents([.year, .month, .day], from: Date())
let truncated = Calendar.current.date(from: comp)!


我该怎么办?

注意样本中时间末尾的
+0000

一天的开始在哪里?我更新了样本以显示您的需求

var comp: DateComponents = Calendar.current.dateComponents([.year, .month, .day], from: Date())
comp.timeZone = TimeZone(abbreviation: "UTC")!
let truncated = Calendar.current.date(from: comp)!
print(truncated)
它打印
2017-06-14 00:00:00+0000
。再次注意结尾处的+0000

默认情况下,时区设置为当前时区,该时区中的小时、分钟和秒为0



我假设您想要当前时区。根据该规定,您的代码是正确的。

日历有专门的方法:

  • 一天的开始

      let truncated = Calendar.current.startOfDay(for: Date())
    
  • 月初

      let now = Date()
      var startOfMonth = now
      var timeInterval : TimeInterval = 0.0
      Calendar.current.dateInterval(of: .month, start: &startOfMonth, interval: &timeInterval, for: now)
    
      print(startOfMonth)
    
  • 年初

      let now = Date()
      var startOfYear = now
      var timeInterval : TimeInterval = 0.0
      Calendar.current.dateInterval(of: .year, start: &startOfYear, interval: &timeInterval, for: now)
    
      print(startOfYear)
    
或作为
日期
分机

extension Date {
    
    func startOf(_ dateComponent : Calendar.Component) -> Date {
        var calendar = Calendar.current
        calendar.timeZone = TimeZone(secondsFromGMT: 0)!
        var startOfComponent = self
        var timeInterval : TimeInterval = 0.0
        calendar.dateInterval(of: dateComponent, start: &startOfComponent, interval: &timeInterval, for: now)
        return startOfComponent
    }
}

let now = Date()

let startOfDay = now.startOf(.day)
let startOfMonth = now.startOf(.month)
let startOfYear = now.startOf(.year)

关于时区问题,您可以相应地设置当前日历的时区。

我有个坏消息告诉您:不是每天都有午夜。嗯。。。为什么?一些背景:我需要提取当前日期、当前月份、当前年份的统计数据。我把它当作临时解决方案使用:Date()。addingTimeInterval((-1)*60*60*24),但这不是我想要的。好的,我已经将标题更改为“开始一天/月/年”。听起来好多了。因为夏令时,还有其他的原因:是的,谢谢。我看到了这个方法,但它并没有帮助我开始这个月。无论如何,杰弗里的回答在我看来是正确的。我错过了时区问题。我更新了月份和年份各自的答案。谢谢。您的解决方案看起来也是有效的。但正如杰弗里所说,最初没有任何问题。我错过了时区问题:)嗨。谢谢!我知道我错过了时区问题。