If I have this date:
dtToUse __NSTaggedDate * 2017-12-31 05:00:00 UTC
which I get from a string using this method:
- (NSDate*) convertStringToDate : (NSString*) strToConvert andTheFormatToUse: (NSString*) strFormat {
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:strFormat];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
return [dateFormatter dateFromString:strToConvert];
}
and I use this code to display it:
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"MM/dd/YYYY"];
NSString* strDate = [dateFormatter stringFromDate:dtExpiration];
self.txtCurrentField.text = [dateFormatter stringFromDate:dtExpiration];
But no matter what I do, the year increments 1 - so 2017 becomes 2018
This only happens for Dec. 31, any year. I suspect it is a time zone issue but I am not sure how to fix, as I am converting time zone to local already
Just try
[dateFormatter setDateFormat:#"MM/dd/yyyy"];
instead of
[dateFormatter setDateFormat:#"MM/dd/YYYY"];
After that, it will show 12/31/2017.
Different between YYYY and yyyy.
https://stackoverflow.com/a/15133656/1342266
Related
I am receiving date in string form from server and I need to show the date according to my time zone (Indian: GMT +5:30).
Here is my code
NSString *dateString = #"2015-08-10 11:45:10";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"yyyy-MM-dd HH:mm:ss"];
//Create the date assuming the given string is in GMT
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSDate *date = [dateFormatter dateFromString:dateString];
NSLog(#"%#",date);
NSLog(#"%#",[dateFormatter stringFromDate:date]);
//Create a date string in the local timezone
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:[NSTimeZone localTimeZone].secondsFromGMT];
NSString *localDateString = [dateFormatter stringFromDate:date];
NSLog(#"date = %#", localDateString);
NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init];
[dateFormatter2 setDateFormat:#"yyyy-MM-dd HH:mm:ss"];
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:[NSTimeZone localTimeZone].secondsFromGMT];
NSDate *date2 = [dateFormatter2 dateFromString:localDateString];
NSLog(#"%#",date);
And the Log is:
2015-08-10 11:45:10 +0000 (NSDate)
2015-08-10 11:45:10 (NSString)
date = 2015-08-10 17:15:10 (NSString)
2015-08-10 11:45:10 +0000 (NSDate)
My issue is with last log (2015-08-10 11:45:10 +0000)
Why it is not 2015-08-10 17:15:10??
The last line prints what it does because you're printing an NSDate, and NSDate does not have a time zone. It literally has no attribute or internal state that indicates a time zone. Time zones exist only for presenting data to users, commonly as you're doing via NSDateFormatter. But if you log the value of an NSDate you'll get a GMT string, since the NSDate itself has no time zone.
I have a string which represents a date stored in military time. I want to display this string in a label in 12 hr time. Here is my code snippet:
NSTimeZone *timeZone = [NSTimeZone localTimeZone];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:timeZone];
[dateFormat setDateFormat:#"MM/dd/yyyy hh:mm:ss"];
NSLog(#"Current Date: %#", [dateFormat stringFromDate:[NSDate date]]);
NSLog(#"Sent date: %#",[myPlanData valueForKey:#"planDate"]);
NSDate *aDate =[dateFormat dateFromString:[myPlanData valueForKey:#"planDate"]];
NSLog(#"Converted date is: %#",aDate);
NSString *planDateString = [dateFormat stringFromDate:aDate];
NSLog(#"The converted date string is: %#",planDateString);
planDateLabel.text=planDateString;
The output is:
Current Date: 06/28/2012 10:08:48 - (so my date formatter appears correct?)
Sent date: 06/30/2012 20:47:34 - (this is the value being sent)
Converted date is: (null) - (Here is where it breaks!)
The converted date string is: (null)
If i change my dateformat to
[dateFormat setDateFormat:#"MM/dd/yyyy HH:mm:ss"];
Everything goes smooth but I end up with Military time being displayed. I simply want to convet that to 12 hr time and display in a label
Well here is how i ended up fixing it
NSTimeZone *timeZone = [NSTimeZone localTimeZone];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:timeZone];
[dateFormat setDateFormat:#"MM/dd/yyyy HH:mm:ss"];
NSDateFormatter *dateFormatback = [[NSDateFormatter alloc] init];
[dateFormatback setTimeZone:timeZone];
[dateFormatback setDateFormat:#"MM/dd/yyyy hh:mm:ss a"];
NSLog(#"Current Date: %#", [dateFormat stringFromDate:[NSDate date]]);
NSLog(#"Sent date: %#",[myPlanData valueForKey:#"planDate"]);
NSDate *aDate =[dateFormat dateFromString:[myPlanData valueForKey:#"planDate"]];
NSLog(#"Converted date is: %#",aDate);
NSString *planDateString = [dateFormatback stringFromDate:aDate];
NSLog(#"The converted date string is: %#",planDateString);
planDateLabel.text=planDateString;
Not sure if this is the best or right way to do it but it works!
I'm trying to produce a string using a NSDate category in this way:
NSString* dateString = nil;
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setLocale:[NSLocal currentLocale]];
[dateFormat setDateFormat:#"dd LLL YYYY"];
dateString = [dateFormat stringFromDate:self];
return dateString;
The conversion works fine except in ONE case (I report the debug session):
if I try to convert an NSDate object like this:
(gdb) po self
2012-01-01 00:00:00 +0000
I obtain:
(gdb) po dateString
01 Jan 2011
Why the year is set back to 2011????
PS. I have already checked NSDate returns wrong year and I'm NOT using the Japanese calendar.
thanks a lot
Try this:
NSDate *pickerDate = [NSDate date];
NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents* components = [[[NSDateComponents alloc] init] autorelease];
components.day = 0; //This value to take from today to next 1 or 2 or 3 days
NSDate* newDate = [calendar dateByAddingComponents: components toDate: pickerDate options: 0];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"dd-MMMM"];
NSString *textDate = [NSString stringWithFormat:#"%#",[dateFormatter stringFromDate:newDate]];
[dateFormatter release];
NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];
[timeFormat setDateFormat:#"hh:mm a"];
NSDate* sourceDate = [timeFormat dateFromString:#"19/11/2010 12:00 am"];
if(sourceDate==nil)
{
NSLog(#"source date nil");
}
I'm using 24 hour setting in iPhone. After I change to 24 hour setting, datefromstring always return nil. I rechange to 12 hour format, it's working again. Why ?
The locale needs to be set to avoid being affected by the 24-hour setting change.
The format also has to match the input string (which in your example includes the date):
NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];
NSLocale *locale = [[[NSLocale alloc]
initWithLocaleIdentifier:#"en_US_POSIX"] autorelease];
[timeFormat setLocale:locale];
[timeFormat setDateFormat:#"dd/MM/yyyy hh:mm a"];
NSDate* sourceDate = [timeFormat dateFromString:#"19/11/2010 12:00 am"];
if(sourceDate==nil)
{
NSLog(#"source date nil");
}
See QA1480 for more information.
I have a Date format:
2009-08-10T16:03:03Z
that I want to convert to:
#"MMM dd, HH:mm a"
I retrieve the xml format in an NSString. I tried to use the NSDateformatter:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MMM dd, HH:mm a"];
any ideas?
NSString *yourXMLDate = #"2009-08-10T16:03:03Z"
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
[inputFormatter setDateFormat:#"yyyy-MM-dd'T'HH:mm:ss"];
NSDate *inputDate = [inputFormatter dateFromString:yourXMLDate];
NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
[outputFormatter setDateFormat:#"MMM dd, HH:mm a"];
NSString *outputDate = [outputFormatter stringFromDate:inputDate];
Hope this helps!
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:#"E, d LLL yyyy HH:mm:ss Z"]; // Thu, 18 Jun 2010 04:48:09 -0700
NSDate *date = [dateFormatter dateFromString:self.currentDate];
[item setObject:date forKey:#"date"];
[items addObject:[item copy]];
here edit the following code
[dateFormatter setDateFormat:#"E, d LLL yyyy HH:mm:ss Z"]; // Thu, 18 Jun 2010 04:48:09 -0700
to your required Format.