【问题标题】:getting wrong time while set date and time in one nsdate separately in ios在ios中分别在一个nsdate中设置日期和时间时出现错误的时间
【发布时间】:2017-06-26 07:30:36
【问题描述】:

当我将事件从应用程序设置到设备日历时。我走错时间了。

  • 我有三个日期选择器,一个用于日期,另外两个用于事件的开始时间和结束时间。我在 EKEvent 中将开始日期设置为结束日期,因为我只需要在那天设置事件。

从日期选择器中获取日期并将其存储为 startdate 并将结束日期存储为 nsdate 类型。下面是我的日期选择器方法

 func pickerDate()
{
    let dateFormatter = DateFormatter()

    dateFormatter.dateFormat = "YYYY-MM-dd"

    routineStartDate = dateFormatter.string(from: self.startDatePicker.date)
     // it is for database entry in string and i get right string
    print(routineStartDate)

    startDate = self.startDatePicker.date as NSDate
    print(startDate)

    endDate = startDate
}

以下方法用于开始时间,我获取时间并转换为时间间隔并将其设置为开始日期。

func starttime() {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm"

    let then: Date? = self.startTimePicker.date
    let difference: TimeInterval? = then?.timeIntervalSinceNow
    startDate.addingTimeInterval(difference!)

    routineStartTime = dateFormatter.string(from: self.startTimePicker.date)
       // it is for database entry in string and i get right string
    print(routineStartTime)

}

下面的方法是结束时间,我从选择器获取时间并转换为时间间隔并将时间间隔设置为结束日期

 func endtime() {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm"

    routineEndTime = dateFormatter.string(from: self.endTimePicker.date)
    print(routineEndTime)
    // it is for database entry in string and i get right string
    let then: Date? = self.endTimePicker.date
    let difference: TimeInterval? = then?.timeIntervalSinceNow
    endDate.addingTimeInterval(difference!)

}

下图显示了我在选择器中设置的日期

下面是我创建事件的我的 EKEvent 方法。

 existevent.title = tempDescription
 existevent.startDate = startDate as Date
 existevent.endDate = endDate as Date
 existevent.isAllDay = false
 existevent.notes = "This is a note"
 existevent.calendar = cal

当我在日历中检查事件时遇到问题,我在事件中得到错误的时间。我将开始时间 12:50 pm 结束时间 1:50 pm 设置为日期2017 年 6 月 27 日在日历应用中。日期设置完美,但为什么时间设置不完美?下图为日历应用程序。

我怀疑时间间隔的转换并设置为日期。但我想念的不知道。 请建议我解决方案和想法。

谢谢

【问题讨论】:

  • 看起来是时区问题。基本上总是使用Calendar 类来做日期数学,这也可以考虑时区。
  • 这个答案将帮助你理解stackoverflow.com/a/30084248/2370587
  • @Maximelc 我看到了你上面的链接,但我不明白我需要做什么样的改变?你会建议我改变吗?

标签: ios swift uidatepicker nstimeinterval ekevent


【解决方案1】:

您需要将时间转换为所需的时区。因为现在日期在您的时区中设置正确,但显示在 +0000 Screenshot 中。使用日历表示日期this

并在这两种方法中更改您的代码:

startDate.addingTimeInterval(difference!)

self.startDate = startDate.addingTimeInterval(difference!)

endDate.addingTimeInterval(difference!)

self.endDate = endDate.addingTimeInterval(difference!)

在您的情况下,Xcode 警告“调用 'addingTimeInterval' 的结果未使用”

尝试转换日期,在将其设置为“existevent”之前,或在您显示它时

func convertDate(date:Date) -> Date {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm" // or other format
    var comp = DateComponents()
    let calendar = Calendar.current
    comp.hour = Calendar.current.component(.hour, from: date)
    comp.minute = Calendar.current.component(.minute, from: date)
    comp.timeZone = TimeZone(abbreviation: "GMT")!
    return calendar.date(from: comp)!
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 2013-07-25
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多