如何从NSDate获取没有时间的日期?

时间:2012-06-20 10:11:55

标签: objective-c nsdate

我想从NSDate获取日期,不需要时间。例如:

NSDate* today = [NSDate date];  // want to give 20-06-2012 only

我想在没有显示时间的情况下获取今天的日期,并在NSDate变量或字符串变量中使用它。

4 个答案:

答案 0 :(得分:42)

以防其他人寻找此事。我使用了以下内容:

NSDateComponents *components = [[NSCalendar currentCalendar] 
             components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit 
              fromDate:[NSDate date]];
NSDate *startDate = [[NSCalendar currentCalendar] 
             dateFromComponents:components];

答案 1 :(得分:8)

就性能而言,这种方法可能比使用 NSDateFormatter NSCalendar 更好。

斯威夫特3,4,5

let timeInterval = floor(Date().timeIntervalSinceReferenceDate / 86400) * 86400
let newDate = Date(timeIntervalSinceReferenceDate: timeInterval)

Swift 2

let timeInterval = floor(NSDate().timeIntervalSinceReferenceDate / 86400) * 86400
let newDate = NSDate(timeIntervalSinceReferenceDate: timeInterval)

您还可以考虑时区(此功能是NSDate扩展的一部分):

斯威夫特3,4,5

extension Date {

    func dateWithoutTime() -> Date {
        let timeZone = TimeZone.current
        let timeIntervalWithTimeZone = self.timeIntervalSinceReferenceDate + Double(timeZone.secondsFromGMT())
        let timeInterval = floor(timeIntervalWithTimeZone / 86400) * 86400
        return Date(timeIntervalSinceReferenceDate: timeInterval)
    }

}

Swift 2

extension NSDate {

    func dateWithoutTime() -> NSDate {
        let timeZone = NSTimeZone.localTimeZone()
        let timeIntervalWithTimeZone = self.timeIntervalSinceReferenceDate + Double(timeZone.secondsFromGMT)
        let timeInterval = floor(timeIntervalWithTimeZone / 86400) * 86400
        return NSDate(timeIntervalSinceReferenceDate: timeInterval)
    }

}

答案 2 :(得分:4)

使用此方法

- (NSString *)curentDateStringFromDate:(NSDate *)dateTimeInLine withFormat:(NSString *)dateFormat {
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

    [formatter setDateFormat:dateFormat];

    NSString *convertedString = [formatter stringFromDate:dateTimeInLine];

    return convertedString;
}

像下面一样使用

NSString *dateString = [self curentDateStringFromDate:[NSDate date] withFormat:@"dd-MM-yyyy"];

答案 3 :(得分:0)

如果有兴趣,我实施了Swift扩展。 这将为您提供当前日期(在您的时区)00:00:00 UTC,我认为当前日期没有时间的含义。

我认为它比@ Murlakatam的回答更好,因为它不涉及弄乱原始timeIntervalSinceReferenceDate,这就是为什么我们首先使用日期对象。

extension NSDate
{
    // Calendar objects are expensive to create to it's better to create and reuse only one.
    private static var cachedNoTimeZoneCalendar: NSCalendar = {
        let calendar = NSCalendar.currentCalendar()
        calendar.timeZone = NSTimeZone(forSecondsFromGMT: 0)
        return calendar
    }()

    func dateWithoutTime() -> NSDate?
    {
        let dateComponents = NSCalendar.currentCalendar().components([.Year, .Month, .Day], fromDate: self)
        return NSDate.cachedNoTimeZoneCalendar.dateFromComponents(dateComponents)
    }
}