使用特定时间创建NSDate

时间:2014-01-28 17:12:32

标签: ios objective-c nsdate nsdateformatter

我有以下问题。我需要从特定时间创建一个NSDate对象。今天在给定时区(有时是CST,EST等)的时间是下午6点。每天不是下午6点,而是在特定时区今天下午6点。

我在考虑使用NSCalendar对象来创建特定的日期/时间,但问题是它需要一天,一个月和一年。那么当我没有正确的日期时,如何设置这些值。示例:

今天是2014年1月28日,科技日的11:09。现在,如果我需要创建一个NSCalendar对象,我需要日,月和年。我无法使用NSDate对象的日,月和年计算,因为它会导致边缘情况出现问题。

有人能指出我正确的方向吗?

5 个答案:

答案 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点?

如果我的猜测是否正确,也许以下内容会有所帮助:

  1. 获取当前日期&时间 - NSDate
  2. 获取当前日历 - NSCalendar
  3. 将日历的时区设置为所需的时区
  4. 使用日历将日期转换为组件 - NSDateComponents - 仅提取年,月,日,小时和组件的组件。时区。现在,您将目标时区中的当前时间分量向下舍入到最接近的小时。
  5. 使用您的日历从您提取的时间组件中创建NSDate。现在,您的缩小时间为NSDate
  6. 使用您的组件计算要添加的小时的数量,以便将时间提前到下一个下午6点。
  7. 将小时数转换为秒以生成NSTimeInterval值,将该时间间隔添加到您的向下舍入日期。 NSDate将根据需要处理推进日期,更改月份等的边缘情况。
  8. 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];

Initialize a NSDate object with a specific time

答案 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];
}