-
-
Save exalted/726910 to your computer and use it in GitHub Desktop.
/* | |
* This will convert DateTime (.NET) object serialized as JSON by WCF to a NSDate object. | |
*/ | |
// 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]; | |
// You can just stop here if all you care is a NSDate object from inputString, | |
// or see below on how to get a nice string representation from that date: | |
// static is nice if you will use same formatter again and again (for example in table cells) | |
static NSDateFormatter *dateFormatter = nil; | |
if (dateFormatter == nil) { | |
dateFormatter = [[NSDateFormatter alloc] init]; | |
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; | |
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; | |
// If you're okay with the default NSDateFormatterShortStyle then comment out two lines below | |
// or if you want four digit year, then this will do it: | |
NSString *fourDigitYearFormat = [[dateFormatter dateFormat] | |
stringByReplacingOccurrencesOfString:@"yy" | |
withString:@"yyyy"]; | |
[dateFormatter setDateFormat:fourDigitYearFormat]; | |
} | |
// There you have it: | |
NSString *outputString = [dateFormatter stringFromDate:date]; |
If the date is pre 2001 it will be less than 10 characters, and you will accidentally consume one of the trailing 0's. I appreciate you want to keep it lean and not parse the whole string to find the end of the text, see my fork for my modification where I look for the start of the number, and use doubleValue which reads the string up to the ), + or - character and divide by 1000 to get time in seconds.
In my project I removed the timezone stuff and format for locales in the UI, but that's up to you
@tristandl since I don't have time to try this I'll take your word about pre 2001 less than 10 chars issue and I'll agree with you. I knew a range of (6, 10) was just an ugly hack to do this, but I assumed JSON string was always "that much long"... Soonish I will create a repo for this and put some other little things of mine for Objective-C language, so I will get serious&deeper on this. Your fix, one way or another, will definitely be there. Thank a lot!
Check out also RestKit/RestKit#264
@exalted Thank you very much, it really helped me !
@Ded77 you're welcome... ;-)
@tristandl thanks a lot for you comment and excuse me for late reply. My code worked at the time for which I needed for, but I don't pretend it to be perfect. Are you just guessing or did you actually encountered this problem? If you think you can fix it any patches are very welcome. Regards.