我有以下问题。我需要从特定时间创建一个NSDate对象。今天在给定时区(有时是CST,EST等)的时间是下午6点。每天不是下午6点,而是在特定时区今天下午6点。
我在考虑使用NSCalendar对象来创建特定的日期/时间,但问题是它需要一天,一个月和一年。那么当我没有正确的日期时,如何设置这些值。示例:
今天是2014年1月28日,科技日的11:09。现在,如果我需要创建一个NSCalendar对象,我需要日,月和年。我无法使用NSDate对象的日,月和年计算,因为它会导致边缘情况出现问题。
有人能指出我正确的方向吗?
答案 0 :(得分:9)
试用NSDateComponents。
// Initialize date components with date values
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setYear:2014];
[dateComponents setMonth:1];
[dateComponents setDay:28];
[dateComponents setHour:11];
[dateComponents setMinute:9];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *configuredDate = [calendar dateFromComponents:dateComponents];
我不确定initWithCalendarIndetifier将采用的各种NSCalendar标识符配置选项,但如果这个答案有用,也许有人可以添加带有一些额外信息的编辑。
答案 1 :(得分:7)
你的担忧似乎与边缘情况有关,这对我来说,而不是“今天下午6点”,你实际上是在寻找“下午6点”,即如果时间是下午6点,你想要明天下午6点?
如果我的猜测是否正确,也许以下内容会有所帮助:
NSDate
NSCalendar
NSDateComponents
- 仅提取年,月,日,小时和组件的组件。时区。现在,您将目标时区中的当前时间分量向下舍入到最接近的小时。NSDate
。现在,您的缩小时间为NSDate
。NSTimeInterval
值,将该时间间隔添加到您的向下舍入日期。 NSDate
将根据需要处理推进日期,更改月份等的边缘情况。HTH
答案 2 :(得分:3)
<强>夫特强>
let calendar = Calendar(identifier: .gregorian)
let units: Set<Calendar.Component> = [.year, .month, .day, .hour]
var components = calendar.dateComponents(units, from: Date())
components.hour = 18
let todayAt6PM = calendar.date(from: components)
目标C
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSCalendarUnit calendarUnits = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour;
NSDateComponents *components = [calendar components:calendarUnits fromDate:[NSDate date]];
[components setHour:18];
NSDate *todayAt6PM = [calendar dateFromComponents:components];
答案 3 :(得分:2)
您可以像这样创建日期:
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *weekdayComponents = [gregorian components:NSCalendarUnitDay fromDate:today];
[weekdayComponents setHour:[timeOfDay intValue]];
[weekdayComponents setMinute:00];
答案 4 :(得分:0)
或者,
NSLocale *const here = [NSLocale currentLocale];
NSDate *const now = [[NSDate alloc] init];
NSCalendar *const calendar = [NSCalendar currentCalendar];
[calendar setLocale: here];
NSTimeZone *const timeZone = [NSTimeZone localTimeZone];
[calendar setTimeZone: timeZone];
NSDate *const midnight = [calendar startOfDayForDate: now];
NSDate *sixOClock = [[NSDate date] initWithTimeInterval: 60 * 60 * (12 + 6) sinceDate: midnight];
if ([now isGreaterThan: sixOClock]) {
sixOClock = [[NSDate date] initWithTimeInterval: 60 * 60 * (12 + 6) + (24 * 60 * 60) sinceDate: midnight];
}