iOS Swift:为我的日期对象设置分钟为0

时间:2017-06-06 19:47:08

标签: ios swift date timezone

首先我的日期是字符串格式:" 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分钟。 **

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

很抱歉,我是用手机写的,所以代码可能不是那么准确,但你会很容易找到这些功能。

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

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

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

答案 2 :(得分:0)

我不知道你的目标是什么时区。如果你只想将你所拥有的日期作为一个字符串向下舍入到最近的整个小时,这将是一种到达目的地的方式:

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

让我知道您对时区转换的意图,我们会愉快地调整上面的代码。

答案 3 :(得分:0)

雨燕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)