gpt4 book ai didi

ios - 在 NSDate 对象中仅存储时区独立时间

转载 作者:行者123 更新时间:2023-11-29 10:49:59 25 4
gpt4 key购买 nike

我正在创建一个包含时间表功能的应用程序,允许用户指定特定日期的时间段(例如,时间段 1 从 9:00 到 10:00;时间段 2 从 10:00 到 11:00,并且很快)。由于该应用程序由 Core Data 支持,因此将周期存储为具有两个 NSDate 属性的 Core Data 管理对象似乎是明智的:startTimeendTime

假设期间不能跨越多天,NSDate 对象中的日期是无关紧要的——我只对时间感兴趣。虽然一种方法是简单地使用 NSDateComponents 来提取时间(并忽略日期),如果我正在对 NSDate 对象进行比较,或者根据这些对象进行排序,那么如果日期不同会影响比较或排序。我在想解决这个问题的一种方法是手动将 startTimeendTime 属性设置为具有相同(任意)选择的日期。这是解决问题的最佳方法吗?

此外,时间(即 NSDate 对象)需要与时区无关。如果用户从澳大利亚旅行到美国,那么我不希望现在一直显示他们在半夜上课!补偿时区变化与此应用程序无关,因此我希望无论时区如何,时间都保持不变。我也很感激在这方面的建议。

在此先感谢您的帮助!

最佳答案

如果您不需要“day date”,我建议您根本不要使用 NSDate,否则您会遇到各种问题。正如评论中所说,NSDate 不支持时区,这意味着您将进行大量不必要的转换以确保您的应用程序在所有时区都能正常工作。

我还可以使用该方法来保存自午夜以来的秒数,或者有两个字段用于自午夜以来的小时和分钟。那基本上是本地时间,总是。

要从 UIDatePicker 获取此信息,您必须将 NSDate 转换为 NSDateComponents

- (IBAction)datePickerChanged:(UIDatePicker *)sender {
NSDate *date = sender.date;
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
calendar.timeZone = sender.timeZone;

NSDateComponents *components = [calendar components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:date];

NSInteger hours = components.hour;
NSInteger minutes = components.minute;
NSLog(@"%02ld:%02ld", (long)hours, (long)minutes);

NSInteger secondsSinceMidnight = hours * (60*60) + minutes * 60;
// save to core data
}

当您想在 datePicker 中显示您的时间时,您必须采用相反的方式,您必须从保存的组件创建一个 NSDate(由于时区原因恰好是今天)。例如:

// get from core data
NSInteger secondsSinceMidnight = 8 * (60*60) + 30 * 60;

NSInteger minutes = (secondsSinceMidnight / 60) % 60;
NSInteger hours = (secondsSinceMidnight / 3600);
NSLog(@"%02ld:%02ld", (long)hours, (long)minutes);

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
calendar.timeZone = datePicker.timeZone;

// use today as day, to avoid timezone issues
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
components.hour = hours;
components.minute = minutes;

datePicker.date = [calendar dateFromComponents:components];

关于ios - 在 NSDate 对象中仅存储时区独立时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20876119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com