从[NSDate date]获取当前日期,但将时间设置为10:00 am


71

如何重设从[NSDate date]检索到的当前日期,然后将时间更改为上午10:00。

Answers:


197

与所有日期操作一样,您必须使用NSDateComponentsNSCalendar

NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:now];
[components setHour:10];
NSDate *today10am = [calendar dateFromComponents:components];

在iOS8中,Apple引入了一种方便的方法,该方法节省了几行代码:

NSDate *d = [calendar dateBySettingHour:10 minute:0 second:0 ofDate:[NSDate date] options:0];

迅速:

let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
let now: NSDate! = NSDate()

let date10h = calendar.dateBySettingHour(10, minute: 0, second: 0, ofDate: now, options: NSCalendarOptions.MatchFirst)!

10
投票了。但是,请摆脱代码中的自动发布。是2014
。– Valeriy Van

65
答案写于2011年。请随时检查和编辑我的其他1093个答案。他们中的许多人可能需要一些现代化。;-)
Matthias Bauch 2014年

为什么不使用[NSCalendar currentCalendar]?这将使代码更加通用。
pronebird 2014年

3
请注意,不推荐使用NSYearCalendarUnit,NSMonthCalendarUnit和NSDayCalendarUnit。相反,请使用NSCalendarUnitYear,NSCalendarUnitMonth和NSCalendarUnitDay。否则,我们可能会得到一些垃圾日期值。
2014年


4

nsdate使用了不同的格式:

NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"MMM dd, yyyy HH:mm"];

NSDate *now = [[NSDate alloc] init];

NSString *dateString = [format stringFromDate:now];

NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
[inFormat setDateFormat:@"MMM dd, yyyy"];

NSDate *parsed = [inFormat dateFromString:dateString]; 

您实际上并没有回答这个问题,但我还是觉得它非常有用:谢谢。:)
布鲁诺·贝洛蒂

3
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setHour:10];
NSDate *date = [gregorian dateByAddingComponents:comps toDate:currentDate  options:0];
[comps release];

尚未在xcode中测试:)


4
那行不通。您正在将10小时添加到当前日期和时间,而不是将时间设置为10:00。
Ole Begemann 2011年

抱歉,我误解了这个问题,@ flucchtpunkt的答案似乎正确
Stefan Ticu 2011年

1

我只是用Matthias Bauch的回答设置了时区,这对我有用。否则将增加18:30分钟。

let cal: NSCalendar = NSCalendar.currentCalendar()
cal.timeZone = NSTimeZone(forSecondsFromGMT: 0)
let newDate: NSDate = cal.dateBySettingHour(1, minute: 0, second: 0, ofDate: NSDate(), options: NSCalendarOptions())!

0

您可以将这种方法用于任何分钟/小时/时间段(又名上午/下午)组合:

- (NSDate *)todayModifiedWithHours:(NSString *)hours
                           minutes:(NSString *)minutes
                         andPeriod:(NSString *)period
{
    NSDate *todayModified = NSDate.date;

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSMinuteCalendarUnit fromDate:todayModified];

    [components setMinute:minutes.intValue];

    int hour = 0;

    if ([period.uppercaseString isEqualToString:@"AM"]) {

        if (hours.intValue == 12) {
            hour = 0;
        }
        else {
            hour = hours.intValue;
        }
    }
    else if ([period.uppercaseString isEqualToString:@"PM"]) {

        if (hours.intValue != 12) {
            hour = hours.intValue + 12;
        }
        else {
            hour = 12;
        }
    }
    [components setHour:hour];

    todayModified = [calendar dateFromComponents:components];

    return todayModified;
}

请求的示例:

NSDate *todayAt10AM = [self todayModifiedWithHours:@"10"
                                           minutes:@"00"
                                         andPeriod:@"am"];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.