2017-11-21 7 views
0

zu holen Ich bekomme zwei Zeitstempel von Server-Antwort. Wie folgtNicht in der Lage, die zwischen Daten von 2 Daten des Zeitstempels in Swift 3

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)") 
    } 
} 

Aber legte die aus ist

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

aber, es aus Oct-12-2017 bis Oktober-14-17

Kann jemand empfehlen, drucken sollte mich, wo es geht in meinem Code schief, danke.

+1

sowohl der Wert ist Sun Jan 18 1970 16:20:24 GMT + 0530, wenn Sie bis heute konvertieren - http://www.ruddwire.com/handy-code/date-to-millisecond-calculators/#. WhQlgkyB0yk –

+0

@AbdulKarim: Es gibt nichts damit zu tun. Weil beide Werte stimmen! Wenn Sie sie in Datum konvertieren, wird es '2017-10-12 16:00:00 + 0000' und' 2017-10-14 00:00:00 + 0000' zurückgeben. – Lion

Antwort

0

Wenn Sie drucken Ihre startdate und enddate direkt (ohne in String-Umwandlung) wird es sein, drucken 2017-10-12 16:00:00 +0000 und 2017-10-14 00:00:00 +0000 jeweils weil es in UTC Format sein wird. Wenn Sie dieses Datum in einen String umwandeln, befindet es sich in Ihrer lokalen Zeitzone! Beispiel: Wenn Sie sich in india befinden, ist Ihre Zeitzone GMT + 05:30 oder UTC + 05:30. Daher wird beim Konvertieren in eine Zeichenfolge 05 : 30 Stunden in Ihr Datum eingefügt.

So, es ist nichts falsch in Ihrem Code. Ihre Ergebnisdaten befinden sich in der Zeitzone gmt + 05 : 30, da Sie sie in eine Zeichenfolge konvertiert haben.

Jetzt, wenn jemand in UK dies tun, dann wird er/sie es in ihrer lokalen Zeitzone finden! Ich meine, sie ausgegeben bekommen, was Sie in Ihrer Frage erwarten, weil britische Zeitzone UTC + 00 : 00 oder GMT + 00 : 00

Nun, wenn Sie auch Ihren String-Wert angezeigt werden sollen in utc oder einer bestimmten Zeitzone oder wenn Sie wollen oben beschriebenes Szenario verhindern, wenn Sie konvertieren date to string, dann kannst du eine bestimmte Zeitzone einstellen! Dann wird das Datum in dieser Zeitzone in einen String umgewandelt (siehe untenstehendes Beispiel). Aber es ist nicht der richtige Weg, es sei denn, Sie haben es kaum benötigt, weil das normale Verhalten ist, dass Sie den Benutzern das Datum in der lokalen Zeitzone zeigen.

Zum Beispiel

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) 

und Ihre Funktion wird,

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)") 
} 

Und wird Ihr Ergebnis sein,

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

Hope this helfen!

+0

Danke für wertvolle Antwort, aber, Zeitzone sollte laut Geräteeinstellungen nur angezeigt werden müssen. Wie wenn mein Gerät GMT ist, sollte es in GMT sein, und andere Person Gerät ist wie UTC, sollte es im UTC-Format sein. –

+0

Ja, das ist, ich sage, dass in Ihrem Code nichts falsch ist. Sie sollten die Zeitzone nicht manuell einstellen! – Lion

Verwandte Themen