0

我有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. 知道为什么它不起作用吗?

编辑

通过将 _newDate 更改为 _date,更新了 dateByAddingInterval 代码中的错字。

4

5 回答 5

2

您正在使用HHa在您的 dateFormat 中。HH表示“24 小时格式的小时”,看起来它优先于a,句点(即 PM)。

使用@"MMM dd, yyyy hh:mm a"with 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

于 2013-07-17T09:22:52.210 回答
2

由于您的 dateString 是 AM/PM 格式,因此您必须使用

[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
于 2013-07-17T10:29:03.730 回答
0
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"MMM dd, yyyy HH:mm a"];
NSDate *_date = [formatter dateFromString:_dateToFormat];

NSlog(@"Date: %@",_date);
于 2013-07-17T11:07:24.847 回答
0

使用 2 种不同的格式化程序,一种用于将字符串转换为日期,另一种用于将日期转换回字符串。第一个应该使用en_US_POSIX语言环境,第二个应该使用系统(默认)语言环境(但如果你想强制使用特定格式,那么你也可以en_US_POSIX在这里使用)。

于 2013-07-17T08:51:07.743 回答
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
于 2018-04-16T13:01:26.527 回答