Подтвердить что ты не робот

Усечение NSDate (время нулевой)

Я хочу создать новый NSDate с 0 часов, 0 минут и 0 секунд для времени. Дата источника может быть любой случайной NSDate.

Есть ли способ достичь этого? Документация мне не помогла.


Пример

Есть: 2010-10-30 10:14:13 GMT

Хотите: 2010-10-30 00:00:00 GMT

4b9b3361

Ответ 1

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]];

Ответ 2

Используйте 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];
}

Ответ 3

С помощью Swift 3 вы можете выбрать один из четырех следующих шаблонов, чтобы решить вашу проблему.


# 1. Используя Calendar startOfDay(for:)

startOfDay(for:) имеет следующее объявление:

func startOfDay(for date: Date) -> Date

Возвращает первый момент заданного Date, как Date.

Ниже приведен пример кода игровой площадки:

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. Используя Calendar date(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.

Ниже приведен пример кода игровой площадки:

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. Используя методы Calendar dateComponents(_:from:) и date(from:)

dateComponents(_:from:) имеет следующее объявление:

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

Возвращает все компоненты даты даты, используя часовой пояс календаря.

date(from:) имеет следующее объявление:

func date(from components: DateComponents) -> Date?

Возвращает дату, созданную из указанных компонентов.

Ниже приведен пример кода на игровой площадке:

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. Используя NSCalendar range(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

Возвращает по ссылке время начала и продолжительность данного блока календаря, который содержит заданную дату.

Ниже приведен пример кода игровой площадки:

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

Swift 3

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

Ответ 5

Я знаю его поздно, но теперь есть лучшие методы: почему вы просто не используете

Swift 2

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

Swift 3 будет чем-то без префикса NS;)

Ответ 6

Я бы использовал метод описания, чтобы получить заданную дату в виде строки, а затем изменить строку и создать новую дату с помощью initWithString.

initWithString: Возвращает объект NSDate, инициализированный значением даты и времени, заданным данной строкой в ​​формате международного строкового представления.

  • (id) initWithString: (NSString *) description параметры описание Строка, которая указывает значение даты и времени в формате международного строкового представления: YYYY-MM-DD HH: MM: SS ± HHMM, где ± HHMM является смещением часового пояса в часах и минутах от GMT (например, "2001- 03-24 10:45:32 +0600" ). Вы должны указать все поля строки форматирования, включая смещение часового пояса, которое должно иметь префикс знака плюс или минус. Возвращаемое значение Объект NSDate, инициализированный значением даты и времени, заданным aString.