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

dateString は AM/PM 形式であるため、使用する必要があります

[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
于 2013-07-17T10:29:03.730 に答える
2

あなたはdateFormatでHHおよびを使用しています。は「24 時間形式の時間」を意味し、ピリオド (つまり PM)よりも優先されるように見えます。aHHa

文字列を NSDate に変換するには、「12 時間形式の時間」を意味する@"MMM dd, yyyy hh:mm a"とともに使用します。hh


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]]して、ローカル タイムゾーンの時刻を確認できます。

しかし、これはNSDateをNSLogするときだけです。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 に答える
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 つの異なるフォーマッターを使用します。1 つは文字列を日付に変換するためのもので、もう 1 つは日付を文字列に変換するためのものです。1 つ目はen_US_POSIXロケールを使用し、2 つ目はおそらくシステム (デフォルト) ロケールを使用する必要があります (ただし、特定の形式を強制したい場合は、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 に答える