使用NSDateFormatter格式化日期不起作用

时间:2013-07-17 08:45:21

标签: objective-c nsdate nsdateformatter

我有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代码的拼写错误。

5 个答案:

答案 0 :(得分:2)

您在dateFormat中使用HHaHH表示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