【问题标题】:iOS Swift: Setting minute to 0 for my date objectiOS Swift:为我的日期对象设置分钟为 0
【发布时间】:2017-11-07 23:29:20
【问题描述】:

首先我的日期是字符串格式:“06-04-2017 06:28:17 PM”

然后我使用以下方法转换为 Date():

let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy hh:mm:ss a"
formatter.timeZone = TimeZone(abbreviation: "GMT")
let startdate = formatter.date(from: sdate!)
print(startdate)

这是上面的输出日期: startdate = 2017-04-06 18:28:17 +0000

但是当我尝试使用以下代码将分钟设置为 0 时。 我改变了我的一天。

let calender = Calendar.current
calendar.timeZone = TimeZone(abbreviation: "UTC")!
let date =  calender.date(bySettingHour: Int(hour)!, minute: 00, second: 00, of: startdate!)
print(date)

输出:2017-04-07 12:15:00 +0000

在我设置了那个时区之后,我的时区是 +5:45 。我得到了同样的错误。

任何帮助。 高度赞赏。

使用以下代码,我得到相同的日期:

let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy hh:mm:ss a"
formatter.timeZone = TimeZone(abbreviation: "GMT")
let startdate = formatter.date(from: sdate!)
print(startdate)

**但是我不能在这里将分钟设置为 0。 **

【问题讨论】:

  • 先不要打印Date也不要乱用timeZone
  • 如果您需要检查您的日期描述,请使用yourDate.description(withLocale: .current)
  • @LeoDabus 没有帮助
  • 您到底需要什么,为什么?您当前位置的午夜还是距格林威治标准时间零秒?
  • 顺便说一句,如果您需要对日期时间不敏感,您应该使用中午而不是午夜。而且应该是当前时区的中午

标签: ios swift date timezone


【解决方案1】:

斯威夫特 5

这个解决方案只是将分钟和秒归零,而不会弄乱小时。

extension Date {

    func startOfHour() -> Date?
    {
        let calendar = Calendar.current

        var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: self)

        components.minute = 0
        components.second = 0

        return calendar.date(from: components)
    }

}

用途:

Date().startOfHour

打印输出:

日期:2019-09-05 15:09:57 +0000

开始日期:可选(2019-09-05 15:00:00 +0000)

【讨论】:

    【解决方案2】:

    首先,您的问题是缺少在第二个 sn-p 中传递小时参数的部分。

    其次,您应该使用日历中的正确方法来设置一个组件:

    let roundedDate = Calendar.current.date(bySetting: .minute, value: 0, of: <# youDateObject #>)
    

    【讨论】:

    • 请注意,此方法也可能导致对更高或耦合组件的更改。例如,将.minute 设置为0 会导致.hour 递增。
    【解决方案3】:

    对不起,我是用手机写的,所以代码可能不是确切的,但你会很容易找到功能。

    在打印日期之前,使用日历将其转换为日期组件;然后将 dateComponents.minute 值设置为 0 并将其重新转换为日期:

    let dateComponents = Calendar.current.dateComponents(fromDate: yourDate)
    dateComponents.minute = 0
    let finishedDate = Calendar.current.date(fromComponents: dateComponents)
    print(finishedDate)
    

    哦,是的,我建议将时区设置为 TimeZone.current,除非您只想使用特定时区!

    【讨论】:

    • 这对我没有帮助:(
    【解决方案4】:

    我不明白您对这些时区的目标是什么。如果您只想将日期作为字符串四舍五入到最新的整小时,这将是一种到达那里的方法:

    extension Date {
    
        public init?(fromStringToBeRounded dateString: String) {
            let formatter = DateFormatter()
            formatter.dateFormat = "dd-MM-yyyy hh:mm:ss a"
            if let startdate = formatter.date(from: sdate) {
                let components = Calendar.current.dateComponents([.year, .month, .day, .hour], from: startdate)
                if let adjustedDate = Calendar.current.date(from: components) {
                    self = adjustedDate
                } else { return nil }
            } else { return nil }
        }
    
    }
    
    let sdate = "06-04-2017 06:28:17 PM"
    Date(fromStringToBeRounded: sdate)! // In production code you better safely unwrap this
    

    让我知道您对时区转换的意图,我会很乐意调整上面的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多