【问题标题】:Not able to fetch the between dates from 2 dates of timestamp in swift 3无法从 swift 3 中的 2 个时间戳日期中获取日期之间的日期
【发布时间】:2017-11-21 12:57:48
【问题描述】:

我从服务器响应中获得了两个时间戳。喜欢关注

    value = 1507824000; //2017-10-12 16:00:00 +0000
    value2 = 1507939200; //2017-10-14 00:00:00 +0000

      let startTimeStamp = dateTimeStampValues["value"] as! String
      let endTimeStamp = dateTimeStampValues["value2"] as! String


     let convertedDate = Double(startTimeStamp)

     let convertedEndDate = Double(endTimeStamp)

     var startdate = Date(timeIntervalSince1970: convertedDate!) 


     let enddate = Date(timeIntervalSince1970: convertedEndDate!) 
    self.showRange(between: startdate, and: enddate)

func showRange(between startDate: Date, and endDate: Date) {
    guard startDate < endDate else { return }

    let calendar = Calendar.current
    let calendarEndDate = calendar.startOfDay(for: endDate)

    var currentDate = calendar.startOfDay(for: startDate)

    while(currentDate <= calendarEndDate) {
        print(currentDate)
        currentDate = Calendar.current.date(byAdding: .day, value: 1, to: currentDate)!
        let dateString = currentDate.convertDateToString(withFormat: "MMM-dd-yyyy h:mm a")
        self.totalDaysFromServerArray.append(dateString)
        print("\(self.totalDaysFromServerArray)")
    }
}

但是,输出是

self.totalDaysFromServerArray is ["Oct-13-2017 12:00 AM", "Oct-14-2017 12:00 AM", "Oct-15-2017 12:00 AM"]

但是,它应该从 2017 年 10 月 12 日至 17 年 10 月 14 日

谁能给我建议,我的代码哪里出了问题,谢谢。

【问题讨论】:

  • 两个值都是 Sun Jan 18 1970 16:20:24 GMT+0530,如果您转换为日期 - ruddwire.com/handy-code/date-to-millisecond-calculators/…
  • @AbdulKarim :与此无关。因为这两个值都是对的!如果您将它们转换为日期,那么它将返回 2017-10-12 16:00:00 +00002017-10-14 00:00:00 +0000

标签: ios iphone xcode date


【解决方案1】:

如果您将直接打印您的startdateenddate(不转换为字符串),它将分别打印2017-10-12 16:00:00 +00002017-10-14 00:00:00 +0000,因为它将采用UTC 格式。当您将该日期转换为字符串时,它将位于您当地的时区!例如,如果您在india,那么您的时区将是GMT + 05:30UTC + 05:30,因此它会在转换为字符串时在您的日期中添加05 : 30 小时。

所以,您的代码没有任何问题。您的结果日期在gmt + 05 : 30 时区,因为您已将它们转换为字符串。

现在,如果 UK 中的某个人这样做,那么他/她会在他们当地的时区找到它!我的意思是他们会得到你所期望的输出,因为英国的时区是UTC + 00 : 00GMT + 00 : 00

现在,如果您想在utc 或任何特定时区中显示您的字符串值,或者如果您想在将日期转换为字符串时防止出现上述情况,那么您可以设置特定时区!然后它将在该时区将日期转换为字符串(参见下面的示例)。但除非您几乎不需要它,否则这不是正确的方法,因为正常行为是您向用户显示本地时区的日期。

例如,

 let value = "1507824000" //2017-10-12 16:00:00 +0000
    let value2 = "1507939200" //2017-10-14 00:00:00 +0000

    let convertedDate = Double(value)

    let convertedEndDate = Double(value2)

    let startdate = Date(timeIntervalSince1970: convertedDate!)


    let enddate = Date(timeIntervalSince1970: convertedEndDate!)
    self.showRange(between: startdate, and: enddate)

你的功能将是,

   func showRange(between startDate: Date, and endDate: Date) {
    guard startDate < endDate else { return }

    let calendar = Calendar.current
    let calendarEndDate = calendar.startOfDay(for: endDate)

    var currentDate = calendar.startOfDay(for: startDate)

    while(currentDate <= calendarEndDate) {
        print(currentDate)
        currentDate = Calendar.current.date(byAdding: .day, value: 1, to: currentDate)!
        let df = DateFormatter.init()
        df.dateFormat = "MMM-dd-yyyy h:mm a"
        df.timeZone = TimeZone.init(abbreviation: "BST")

        let dateString = df.string(from: currentDate)
        totalDaysFromServerArray.append(dateString)

    }
    print("\(totalDaysFromServerArray)")
}

你的结果将是,

  Oct-12-2017 7:30 PM Oct-13-2017 7:30 PM Oct-14-2017 7:30 PM

希望这会有所帮助!

【讨论】:

  • 感谢您的宝贵回复,但是,时区应该根据设备设置只需要显示。就像如果我的设备是 GMT,它应该是 GMT,而其他人的设备是 UTC,它应该是 UTC 格式。
  • 是的,我是说您的代码没有任何问题。您不应该手动设置时区!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2013-12-01
  • 2020-01-06
  • 2023-03-22
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多