Kann jemand ein JSON-Datum (Ticks) in ein NSDate in Objective-C konvertieren? Kann jemand etwas Code posten?JSON-Datum (Ticks) in NSDate konvertieren
Antwort
Ich rate hier aber Ihr JSON-Wert ist die Anzahl der Millisekunden seit 1970, oder? Sie können die Methode dateWithTimeIntervalSince1970:
von NSDate verwenden, um ein NSDate-Objekt mit der richtigen Uhrzeit zurückzugeben. Stellen Sie nur sicher, dass Sie die Anzahl der JSON-Millisekunden in Sekunden konvertieren, bevor Sie sie an NSDate übergeben. Cocoa verwendet an den meisten Stellen NSTimeInterval, was ein Intervall in Sekunden darstellt.
Sie müssten das Gebietsschema des Clients erkennen, um dies zu können, und wenn Ihr Client nicht weiß, wie das geht, gibt es wahrscheinlich nicht viel Sinn.
NSDate BeschreibungWithLocale: wäre die Art, wie Sie es für ein anderes Gebietsschema formatieren. Und timeIntervalSince1970 wird auf die (Sekunden) seit 1970 zurückgehen, die Sie mit 1000 multiplizieren könnten, um ms zu erhalten, um zum Client zurückzukehren. Es ist alles in der NSDate-Dokumentation.
Es geht ungefähr so:
// Input string is something like: "/Date(1292851800000+0100)/" where
// 1292851800000 is milliseconds since 1970 and +0100 is the timezone
NSString *inputString = [item objectForKey:@"DateTimeSession"];
// This will tell number of seconds to add according to your default timezone
// Note: if you don't care about timezone changes, just delete/comment it out
NSInteger offset = [[NSTimeZone defaultTimeZone] secondsFromGMT];
// A range of NSMakeRange(6, 10) will generate "1292851800" from "/Date(1292851800000+0100)/"
// as in example above. We crop additional three zeros, because "dateWithTimeIntervalSince1970:"
// wants seconds, not milliseconds; since 1 second is equal to 1000 milliseconds, this will work.
// Note: if you don't care about timezone changes, just chop out "dateByAddingTimeInterval:offset" part
NSDate *date = [[NSDate dateWithTimeIntervalSince1970:
[[inputString substringWithRange:NSMakeRange(6, 10)] intValue]]
dateByAddingTimeInterval:offset];
Diese Lösung ist zerbrechlich. Es funktioniert nur, wenn die Zahl genau 13 Ziffern hat (oder 10, wenn Sie die Mikrosekunden fallen lassen). Es wird nicht für alle Termine vor September 2001 funktionieren. –
Martin, du hast Recht. Ich hoffe, dass Verweis verwiesener Link Ihnen mehr Kontext zur Verfügung stellt. – Ali
Nach dieser Seite: http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx Zecken beginnen am 1. Jan. 0001 so dateWithTimeIntervalSince1970:
ist nicht automatisch Setup Arbeit mit Zecken. Sie können diese Methode weiterhin verwenden, sollten jedoch den Unterschied anpassen.
Danke Marc. Das hat für mich funktioniert. Wissen Sie, wie das NSDate in der lokalen Zeitzone des Clients angezeigt wird? –
Wissen Sie auch, wie von NSDate zurück Datum (Ticks) gehen, um das JSON-Objekt vorzubereiten, das an einen .net Webservice gesendet werden soll? –