objective-c - 由于时区,NSDate 转换混乱
问题描述
我正在尝试在时间选择器上设置时间值,问题是由于时区问题导致时间混乱。这是我使用的代码片段:
int targetmillisondsFromMidnight = [self.schedule.targetHour intValue]; // 59580000
NSDate* todayMidnight = [NSCalendar.currentCalendar startOfDayForDate:[NSDate new]]; //2019-12-23 00:00:00 UTC
NSTimeZone* timezone = [NSTimeZone defaultTimeZone];
NSInteger seconds = [timezone secondsFromGMT];
todayMidnight = [todayMidnight dateByAddingTimeInterval:seconds];
NSDate* scheduleDate = [NSDate dateWithTimeInterval:targetmillisondsFromMidnight/1000 sinceDate:todayMidnight]; //2019-12-23 16:33:00 UTC
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone:[NSTimeZone defaultTimeZone]];
NSDateComponents *components = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:scheduleDate];
[self.datePicker setTimeZone:[NSTimeZone defaultTimeZone]];
[self.datePicker setDate:[calendar dateFromComponents:components] animated:YES];
当我这样做po [components hour]
而不是得到 16 时,scheduleDate
我得到 18。我该如何解决这个问题?我试图将时区更改为localTimeZone
,timeZoneWithAbbreviation:@"GMT"
但似乎没有任何效果。
解决方案
It looks like you do superfluous conversion
Let's consider the following code
NSDate *date = [NSDate new]; // << in UTC always
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone:[NSTimeZone defaultTimeZone]]; // << in local
NSDateComponents *components = [calendar components:
(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date]; // << converted to local
debug output:
(lldb) po date
2019-12-24 09:53:12 +0000
(lldb) po components
<NSDateComponents: 0x600003c78710> {
Hour: 10
Minute: 53
推荐阅读
- sql - 如何确保 Postgres 范围类型表完全覆盖一个范围?
- python - 使用 selenium 选择下拉选项
- java - 在 Jetbrain 的 Intelij IDEA 上运行 java 代码传递文件作为输入参数
- gitlab - GitLab:找不到“合并请求的默认描述模板”
- javascript - 如何知道鼠标悬停在 DIV 中哪个位置的哪个字符
- python - 在 MNIST 深度神经网络训练 TensorFlow 2.0 上使用 model.fit 时出错
- r - 带有闪亮的 R flexdashboard - 侧边栏
- mininet - 使用 openflow 控制器在 mininet 上无法访问的主机
- json - 如何在 Postgres 中连接 JArray 元素?
- c# - Xamarin:从本地文件(不是资源)导入 SKBitmap