web-dev-qa-db-ja.com

NSDateを切り捨てます(ゼロアウト時間)

時間の時間で新しいNSDateを生成したいと思います。ソース日付は任意のランダムなNSDateにすることができます。

これを達成する方法はありますか?ドキュメントはこれで私を助けませんでした。


持ってる: 2010-10-30 10:14:13 GMT

欲しいです: 2010-10-30 00:00:00 GMT

31
Benjamin
unsigned int flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:flags fromDate:date];
NSDate* dateOnly = [calendar dateFromComponents:components];

dateは、時間を削除する日付です。

これにより、日付と時刻が分離され、デフォルトの時刻(00:00:00)で新しい日付が作成されます。

[〜#〜]編集[〜#〜]

タイムゾーンを考慮に入れるには:

NSDate* dateOnly = [[calendar dateFromComponents:components] dateByAddingTimeInterval:[[NSTimeZone localTimeZone]secondsFromGMT]];
63
Evan Mulawski

NSCalendarのrangeOfUnit:startDate:interval:forDate:を使用します。このコードは、現在のタイムゾーンに基づいて日の境界を選択します。特定のタイムゾーンが必要な場合は、NSCalendarを作成し、そのタイムゾーンを適切に設定する必要があります。

- (NSDate*)boundaryForCalendarUnit:(NSCalendarUnit)calendarUnit
{
    NSDate *boundary;
    [[NSCalendar currentCalendar] rangeOfUnit:calendarUnit startDate:&boundary interval:NULL forDate:self];
    return boundary;
}

- (NSDate*)dayBoundary
{
    return [self boundaryForCalendarUnit:NSDayCalendarUnit];
}
17
Rob Napier

Swift 3)を使用すると、問題を解決するために、次の4つのパターンのいずれかを選択できます。


#1。 CalendarstartOfDay(for:)の使用

startOfDay(for:) には次の宣言があります。

_func startOfDay(for date: Date) -> Date
_

指定されたDateの最初の瞬間をDateとして返します。

以下のPlaygroundコードは、この方法の使用方法を示しています。

_import Foundation

let date = Date()

// Get new date
let calendar = Calendar.current
let newDate = calendar.startOfDay(for: date)

// Format dates
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_UK")
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .long

let formattedDate = dateFormatter.string(from: date)
let formattedNewDate = dateFormatter.string(from: newDate)

// Print formatted dates
print(formattedDate) // Prints: 30/03/2017, 15:14:41 CEST
print(formattedNewDate) // Prints: 30/03/2017, 00:00:00 CEST
_

#2。 Calendardate(bySettingHour:minute:second:of:matchingPolicy:repeatedTimePolicy:direction:)の使用

date(bySettingHour:minute:second:of:matchingPolicy:repeatedTimePolicy:direction:) には次の宣言があります。

_func date(bySettingHour hour: Int, minute: Int, second: Int, of date: Date, matchingPolicy: Calendar.MatchingPolicy = default, repeatedTimePolicy: Calendar.RepeatedTimePolicy = default, direction: Calendar.SearchDirection = default) -> Date?
_

指定されたDateの指定された時刻に時、分、秒を設定して計算された日付を表す新しいDateを返します。

以下のPlaygroundコードは、この方法の使用方法を示しています。

_import Foundation

let date = Date()

// Get new date
let calendar = Calendar.current
let newDate = calendar.date(bySettingHour: 0, minute: 0, second: 0, of: date)

// Format dates
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_UK")
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .long

let formattedDate = dateFormatter.string(from: date)
let formattedNewDate = dateFormatter.string(from: newDate!)

// Print formatted dates
print(formattedDate) // Prints: 30/03/2017, 15:14:41 CEST
print(formattedNewDate) // Prints: 30/03/2017, 00:00:00 CEST
_

#3。 CalendardateComponents(_:from:)およびdate(from:)メソッドの使用

dateComponents(_:from:) には次の宣言があります。

_func dateComponents(_ components: Set<Calendar.Component>, from date: Date) -> DateComponents
_

カレンダーのタイムゾーンを使用して、日付のすべての日付コンポーネントを返します。

date(from:) には次の宣言があります。

_func date(from components: DateComponents) -> Date?
_

指定されたコンポーネントから作成された日付を返します。

以下のPlaygroundコードは、これらのメソッドの使用方法を示しています。

_import Foundation

let date = Date()

// Get new date
let calendar = Calendar.current
let components = calendar.dateComponents([.day, .month, .year], from: date)
let newDate = calendar.date(from: components)

// Format dates
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_UK")
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .long

let formattedDate = dateFormatter.string(from: date)
let formattedNewDate = dateFormatter.string(from: newDate!)

// Print formatted dates
print(formattedDate) // Prints: 30/03/2017, 15:14:41 CEST
print(formattedNewDate) // Prints: 30/03/2017, 00:00:00 CEST
_

#4。 NSCalendarrange(of:start:interval:for:)の使用

range(of:start:interval:for:) には次の宣言があります。

_func range(of unit: NSCalendar.Unit, start datep: AutoreleasingUnsafeMutablePointer<NSDate?>?, interval tip: UnsafeMutablePointer<TimeInterval>?, for date: Date) -> Bool
_

特定の日付を含む特定のカレンダー単位の開始時刻と期間を参照により返します。

以下のPlaygroundコードは、この方法の使用方法を示しています。

_import Foundation

let date = Date()

// Get new date
let calendar = Calendar.current as NSCalendar
var newDate: NSDate?
calendar.range(of: .day, start: &newDate, interval: nil, for: date)

// Format dates
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_UK")
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .long

let formattedDate = dateFormatter.string(from: date)
let formattedNewDate = dateFormatter.string(from: newDate as! Date)

// Print formatted dates
print(formattedDate) // Prints: 30/03/2017, 15:14:41 CEST
print(formattedNewDate) // Prints: 30/03/2017, 00:00:00 CEST
_
4
Imanou Petit

私はそれが遅いことを知っていますが、今ではより良い方法があります:なぜあなたはただ使用しないのですか

スウィフト2

NSCalendar.currentCalendar().dateBySettingHour(0, minute: 0, second: 0, ofDate: yourDateToZeroOutTime, options: [])

Swift 3は、NSプレフィックス;)のないものになります

2
smat88dd

Swift

extension Date {
    func trimTime() -> Date {
        var boundary = Date()
        var interval: TimeInterval = 0
        _ = Calendar.current.dateInterval(of: .day, start: &boundary, interval: &interval, for: self)

        return Date(timeInterval: TimeInterval(NSTimeZone.system.secondsFromGMT()), since: boundary)
    }
}
1
Chris Byatt

Descriptionメソッドを使用して、指定された日付を文字列として取得し、文字列を変更して、initWithStringを使用して新しい日付を作成します。

initWithString:指定された文字列で指定された日付と時刻の値で初期化されたNSDateオブジェクトを国際文字列表現形式で返します。

  • (id)initWithString:(NSString *)descriptionパラメータの説明国際文字列表現形式で日付と時刻の値を指定する文字列—YYYY-MM-DD HH:MM:SS±HHMM、ここで±HHMMはのタイムゾーンオフセットです。 GMTからの時間と分(たとえば、「2001-03-24 10:45:32 +0600」)。プラスまたはマイナス記号のプレフィックスが必要なタイムゾーンオフセットを含む、フォーマット文字列のすべてのフィールドを指定する必要があります。戻り値aStringで指定された日付と時刻の値で初期化されたNSDateオブジェクト。
0
jakev