我有NSString
这个我想格式化的日期和时间:
Jul 17, 2013 09:10 PM
我想将其格式化为:
yyyy-MM-dd HH:mm
但它不起作用。
这是我正在使用的代码:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
NSDate *_date = [formatter dateFromString:_dateToFormat];
NSLog(@"_date: %@", _date);
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
NSString *_newDate = [formatter stringFromDate:_date];
NSLog(@"_newDate: %@", _newDate);
NSLog
返回:
_date: 2013-07-17 04:10:00 +0000
_newDate: 2013-07-17 04:10:00 +0000
我错过了什么吗?格式化日期后,我想使用代码从格式化日期中减去45分钟:
_newDate = [_date dateByAddingTimeInterval:-60*45];
NSLog(@"Subtracted date: %@", _newDate);
但现在这不是我的担心,因为第一步不起作用,即从NSString
格式化日期。知道为什么它不起作用吗?
通过使用_date更改_newDate,更新了dateByAddingInterval代码的拼写错误。
答案 0 :(得分:2)
您在dateFormat中使用HH
和a
。 HH
表示24小时格式"小时",看起来它优先于a
,即句号(即PM)。
将@"MMM dd, yyyy hh:mm a"
与hh
一起使用,这意味着以12小时格式"小时"将您的字符串转换为NSDate。
NSString *_dateToFormat = @"Jul 17, 2013 09:10 PM"; // this is in local time zone! (mine is UTC+2)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[formatter setDateFormat:@"MMM dd, yyyy HH:mm a"];
NSDate *_date = [formatter dateFromString:_dateToFormat];
NSLog(@"wrong _date: %@", _date);
[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
_date = [formatter dateFromString:_dateToFormat];
NSLog(@"correct _date: %@", _date); // this is in UTC, not in local time zone!
NSLog(@"correct _date: %@", [_date descriptionWithLocale:[NSLocale currentLocale]]); // this should be in your local timezone
输出:
wrong _date: 2013-07-17 10:10:00 +0000
correct _date: 2013-07-17 19:10:00 +0000 (in my timezone: 21:10, or 09:10 PM)
correct _date: Wednesday, July 17, 2013, 9:10:00 PM Central European Summer Time
请记住,打印NSDate通常以UTC格式打印。因此,如果您的时区不同,则记录的NSDate将与您的输入日期不匹配。它将受到您的时区和UTC之间的偏移的影响。
您可以打印[_date descriptionWithLocale:[NSLocale currentLocale]]
以查看当地时区的时间。
但这就是你NSLog NSDate的时候。 NSDate仍然是正确的,它只是打印输出似乎是错误的。
总而言之,您的代码应如下所示:
NSString *_dateToFormat = @"Jul 17, 2013 09:10 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
// create date from string
NSDate *_date = [formatter dateFromString:_dateToFormat];
// subtract 45 minutes
_date = [_date dateByAddingTimeInterval:-60*45];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
// turn date into string
NSString *_newDate = [formatter stringFromDate:_date];
NSLog(@"%@", _newDate);
输出:2013-07-17 20:25
答案 1 :(得分:2)
由于你的dateString是AM / PM格式,你必须使用
[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
答案 2 :(得分:0)
使用2种不同的格式化程序,一种用于将字符串转换为日期,另一种用于将日期转换回字符串。第一个应该使用en_US_POSIX
语言环境,第二个应该使用系统(默认)语言环境(但是如果你想强制使用特定的格式,那么你也可以在这里使用en_US_POSIX
。)
答案 3 :(得分:0)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM dd, yyyy HH:mm a"];
NSDate *_date = [formatter dateFromString:_dateToFormat];
NSlog(@"Date: %@",_date);
答案 4 :(得分:0)
(代表作者提问回答)。
我设法使用适当的输出日志使用此代码:
NSString *oldDate = @"Jul 17, 2013 09:10 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
NSDate *_date = [formatter dateFromString:oldDate];
NSLog(@"_date: %@", _date);
_date = [_date dateByAddingTimeInterval:-60*45];
NSLog(@"_date2: %@", _date);
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
NSString *_newDate2 = [formatter stringFromDate:_date];
NSLog(@"_newDate2: %@", _newDate2);
输出:
_date: 2013-07-17 13:10:00 +0000
_newDate: 2013-07-17 21:10
_date2: 2013-07-17 12:25:00 +0000
_newDate2: 2013-07-17 20:25