Obj-C,格式化日期时出现问题,增加一天吗?

发布于 2024-11-02 07:05:08 字数 475 浏览 2 评论 0原文

我在我的应用程序/功能中发现了一个错误。我传入一个日期的 NSString。 然后该函数使用 NSDateFotmatterShortStyle。

这是我在调试器中的函数的屏幕截图。

我希望最终的日期为 2011-04-18 也不知道为什么它添加了 1ppm,我需要它是 00:00:00

在此处输入图像描述

发生了什么以及如何发生我要解决这个问题吗?

我从这里使用 MidnightUTC 函数( 如何将当前日期(或任何日期)创建为不带小时、分钟和秒的 NSDate?)以消除小时。

I've discovered a bug in my app / function. I pass in a NSString of a date.
The function then uses the NSDateFotmatterShortStyle.

Heres a screen shot of my function in the debugger.

I'd like to end up with a date of 2011-04-18
Not sure why its added 1ppm either, I need it to be 00:00:00

enter image description here

Whats happening and how do I fix this ?

I use the MidnightUTC function from here ( How do I create the current date (or any date) as an NSDate without hours, minutes and seconds? ) to get rid of the hours.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烦人精 2024-11-09 07:05:08

实际上,我认为午夜UTC 方法和您提供的代码之间没有任何联系。

无论如何,您给定示例的问题是,字符串 4/18/11 的解析将默认缺少诸如分钟等的值和您当前的时区,但该字符串将被假定为 GMT时间,因此这将导致您看到的偏移量。

解决方案是为 NSDateFormatter 设置时区。看看这段代码,我一分钟前测试过它,以及控制台输出。 aaa 显示了奇怪的偏移量,bbb 看起来确实符合预期。

NSDateFormatter *dt = [[[NSDateFormatter alloc] init] autorelease];

[dt setDateStyle:NSDateFormatterShortStyle];

NSDate *aaa = [dt dateFromString:@"4/18/11"];

NSLog(@"1a. %@", [dt timeZone]);    
NSLog(@"1b. %@", aaa);

[dt setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSDate *bbb = [dt dateFromString:@"4/18/11"];

NSLog(@"2a. %@", [dt timeZone]);        
NSLog(@"2b. %@", bbb);

控制台输出

1a. Europe/Berlin (CEST) offset 7200 (Daylight)
1b. 2011-04-17 22:00:00 +0000
2a. GMT (GMT+00:00) offset 0
2b. 2011-04-18 00:00:00 +0000

I actually see no connection between the midnightUTC method and your provided code.

Anyway, the problem with your given example is that, the parsing of the string 4/18/11 will default the missing values like minutes etc AND your current time zone, but the string will be assumed as GMT time so this will result in the offset you see.

The solution is to set the time zone for the NSDateFormatter. Look at this code, I've tested it a minute ago, and the console output. aaa reveals the odd offset, bbb does look as expected.

NSDateFormatter *dt = [[[NSDateFormatter alloc] init] autorelease];

[dt setDateStyle:NSDateFormatterShortStyle];

NSDate *aaa = [dt dateFromString:@"4/18/11"];

NSLog(@"1a. %@", [dt timeZone]);    
NSLog(@"1b. %@", aaa);

[dt setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSDate *bbb = [dt dateFromString:@"4/18/11"];

NSLog(@"2a. %@", [dt timeZone]);        
NSLog(@"2b. %@", bbb);

Console output

1a. Europe/Berlin (CEST) offset 7200 (Daylight)
1b. 2011-04-17 22:00:00 +0000
2a. GMT (GMT+00:00) offset 0
2b. 2011-04-18 00:00:00 +0000
夕嗳→ 2024-11-09 07:05:08

您使用的午夜UTC函数通过将时区设置为GMT来创建日期,这与半年的UTC不同。 UTC 不会观察到任何夏季/夏令时变化,而 GMT 会观察到,因此 [NSTimeZone timeZoneForSecondsFromGMT:0] 将在大约半年的时间里比 UTC 晚一个小时。

the midnightUTC function you're using creates dates by setting the timeZone to GMT, which is different from UTC half the year. UTC doesn't observe any summer / daylight savings time changes, while GMT does, so [NSTimeZone timeZoneForSecondsFromGMT:0] will be an hour off UTC for roughly half the year.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文