web-dev-qa-db-ja.com

NSDateから時間なしで日付を取得するにはどうすればよいですか?

NSDateから日付を取得したいのですが、時間は必要ありません。例:

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

時間を表示せずに今日の日付を取得し、NSDate変数または文字列変数で使用したい。

33
Ghass.64

他の誰かがこれを探している場合。私は以下を使用しました:

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

パフォーマンスの点では、このアプローチはNSDateFormatterまたはNSCalendarを使用するよりも優れている場合があります。

Swift 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拡張機能の一部です):

Swift 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)
    }

}
9
Murlakatam

この方法を使用

- (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"];
4
Muhammad_Awaab

私はSwift拡張機能を実装しました。興味がある場合は、これを使用してください。これにより、現在の日付(タイムゾーン)が00:00:00 UTCに表示されます。これは時間のない現在の日付

生のtimeIntervalSinceReferenceDateをいじる必要がないので、@ Murlakatamの答えよりも優れていると思います。最初に日付オブジェクトを使用するのはこのためです。

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)
    }
}
0
deadbeef