Поиск…


Синтаксис

  • NSDate () // NSDate объект init для текущей даты и времени
  • NSDate (). TimeIntervalSince1970 // Текущая дата и время в количестве секунд с 00:00:00 по UTC 1 января 1970 года.
  • NSDate (). Compare (other: NSDate) // Возвращает сравнение текущей даты с другой датой возвращает NSComparisonResult

замечания

Существуют различные типы формата даты, которые вы можете установить: Вот полный список из них.

Формат Значение / Описание Example1 Example2
Y Год с не менее 1 разрядом. 175 AD → «175» 2016 AD → «2016»
уу Год с ровно 2 цифрами. 5 AD → «05» 2016 AD → «16»
ууу Год, по крайней мере, 3 цифры. 5 AD → «005» 2016 AD → «2016»
гггг Год, по крайней мере, 4 цифры. 5 AD → «0005» 2016 AD → «2016»
M Месяц с не менее 1 разрядом. Июль → «7» «Ноябрь» → «11»
М.М. Месяц не менее 2-х цифр. Июль → «07» «Ноябрь» → «11»
MMM Сокращение на три буквы месяца. Июль → "Jul" «Ноябрь» → «Ноябрь»
MMMM Полное название месяца. Июль → «Июль» «Ноябрь» → «Ноябрь»
MMMMM Сокращение аббревиатуры одного месяца (январь, июнь, июль, все будут иметь «J»). Июль → «J» «Ноябрь» → «N»
d День с по крайней мере одной цифрой. 8 → «8» 29 → «29»
дд День с по крайней мере двумя цифрами. 8 → «08» 29 → «29»
«E», «EE» или «EEE», 3-х дневная аббревиатура имени дня. Понедельник → «Пн» Четверг → "Thu"
ЕЕЕЕ Полное имя дня. Понедельник → «Понедельник» Четверг → «Четверг»
EEEEE 1-дневная аббревиатура дневного названия (Thu и Tue будет «T») Понедельник → «М» Четверг → «Т»
EEEEEE 2-х дневная аббревиатура имени дня. Понедельник → «Мо» Четверг → "Th"
Период дня (AM / PM). 10 PM → «PM» 2 AM → «AM»
час 1-12 основанный час с по крайней мере 1 цифрой. 10 вечера → «10» 2 AM → «2»
чч 1-12 основанный час с по крайней мере 2 цифрами. 10 вечера → «10» 2 AM → «02»
ЧАС 0-23 балла с по крайней мере 1 цифрой. 10 вечера → «14» 2 AM → «2»
HH A 0-23 базирующийся час, по крайней мере, 2 цифры. 10 вечера → «14» 2 AM → «02»
м Минуту, по крайней мере, 1 цифру. 7 → "7" 29 → «29»
мм Минута, по крайней мере, 2 цифры. 7 → «07» 29 → «29»
s Вторая с не менее чем 1 цифрой. 7 → "7" 29 → «29»
сс Второй, по крайней мере, 2 цифры. 7 → «07» 29 → «29»

Есть много других, для получения разного времени, основанного на зоне (z), для получения времени с миллисекундными деталями (S) и т. Д.

Получить текущую дату

Получение текущей даты очень просто. Вы получаете объект NSDate текущей даты только в одной строке следующим образом:

стриж

var date = NSDate()

Swift 3

var date = Date()

Objective-C

NSDate *date = [NSDate date];

Получить NSDate Object N секунд с текущей даты

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

Для этого у нас есть метод с именем dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate (Swift) или + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds (Objective-C).

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

стриж

let totalSecondsInWeek:NSTimeInterval = 7 * 24 * 60 * 60;
//Using negative value for previous date from today
let nextWeek = NSDate().dateWithTimerIntervalSinceNow(totalSecondsInWeek)

//Using positive value for future date from today
let lastWeek = NSDate().dateWithTimerIntervalSinceNow(-totalSecondsInWeek)

Swift 3

let totalSecondsInWeek:TimeInterval = 7 * 24 * 60 * 60;

//Using positive value to add to the current date
let nextWeek = Date(timeIntervalSinceNow: totalSecondsInWeek)

//Using negative value to get date one week from current date
let lastWeek = Date(timeIntervalSinceNow: -totalSecondsInWeek)

Objective-C

NSTimeInterval totalSecondsInWeek = 7 * 24 * 60 * 60;
//Using negative value for previous date from today
NSDate *lastWeek = [NSDate dateWithTimeIntervalSinceNow:-totalSecondsInWeek];

//Using positive value for future date from today
NSDate *nextWeek = [NSDate dateWithTimeIntervalSinceNow:totalSecondsInWeek];

NSLog(@"Last Week: %@", lastWeek);
NSLog(@"Right Now: %@", now);
NSLog(@"Next Week: %@", nextWeek);

Сравнение даты

Существует 4 метода сравнения дат:

стриж

  • isEqualToDate(anotherDate: NSDate) -> Bool
  • earlierDate(anotherDate: NSDate) -> NSDate
  • laterDate(anotherDate: NSDate) -> NSDate
  • compare(anotherDate: NSDate) -> NSComparisonResult

Objective-C

  • - (BOOL)isEqualToDate:(NSDate *)anotherDate
  • - (NSDate *)earlierDate:(NSDate *)anotherDate
  • - (NSDate *)laterDate:(NSDate *)anotherDate
  • - (NSComparisonResult)compare:(NSDate *)anotherDate

Предположим, у нас есть 2 даты:

стриж

let date1: NSDate = ... // initialized as  July 7, 2016 00:00:00
let date2: NSDate = ... // initialized as  July 2, 2016 00:00:00

Objective-C

NSDate *date1 = ... // initialized as  July 7, 2016 00:00:00
NSDate *date2 = ... // initialized as  July 2, 2016 00:00:00

Затем, чтобы сравнить их, мы попробуем этот код:

стриж

if date1.isEqualToDate(date2) {
    // returns false, as both dates aren't equal
}

earlierDate: NSDate = date1.earlierDate(date2) // returns the earlier date of the two (date 2)
laterDate: NSDate = date1.laterDate(date2) // returns the later date of the two (date1)

result: NSComparisonResult = date1.compare(date2)

if result == .OrderedAscending {
    // true if date1 is earlier than date2
} else if result == .OrderedSame {
    // true if the dates are the same
} else if result == .OrderedDescending {
    // true if date1 is later than date1
}

Objective-C

if ([date1 isEqualToDate:date2]) {
    // returns false, as both date are not equal
}

NSDate *earlierDate = [date1 earlierDate:date2]; // returns date which comes earlier from both date, here it will return date2
NSDate *laterDate = [date1 laterDate:date2]; // returns date which comes later from both date, here it will return date1

NSComparisonResult result = [date1 compare:date2];
if (result == NSOrderedAscending) {
    // fails
    // comes here if date1 is earlier then date2, in our case it will not come here
} else if (result == NSOrderedSame){
    // fails
    // comes here if date1 is same as date2, in our case it will not come here
} else{ // NSOrderedDescending
    // succeeds
    // comes here if date1 is later than date2, in our case it will come here
}

Если вы хотите сравнить даты и обрабатывать секунды, недели, месяцы и годы:

Swift 3

let dateStringUTC = "2016-10-22 12:37:48 +0000"
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss X"
let date = dateFormatter.date(from: dateStringUTC)!

let now = Date()

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.maximumUnitCount = 2
let string = formatter.string(from: date, to: Date())! + " " + NSLocalizedString("ago", comment: "added after elapsed time to say how long before")

Или вы можете использовать это для каждого компонента:

// get the current date and time
let currentDateTime = Date()

// get the user's calendar
let userCalendar = Calendar.current

// choose which date and time components are needed
let requestedComponents: Set<Calendar.Component> = [
    .year,
    .month,
    .day,
    .hour,
    .minute,
    .second
]

// get the components
let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDateTime)

// now the components are available
dateTimeComponents.year 
dateTimeComponents.month 
dateTimeComponents.day  
dateTimeComponents.hour 
dateTimeComponents.minute
dateTimeComponents.second

Получить время Unix Epoch

Чтобы получить Unix Epoch Time , используйте константу timeIntervalSince1970 :

стриж

let date = NSDate() // current date
let unixtime = date.timeIntervalSince1970

Objective-C

NSDate *date = [NSDate date]; // current date
int unixtime = [date timeIntervalSince1970];

NSDateFormatter

Преобразование объекта NSDate в строку - всего 3 шага.

1. Создайте объект NSDateFormatter

стриж

let dateFormatter = NSDateFormatter()

Swift 3

let dateFormatter = DateFormatter()

Objective-C

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

2. Установите формат даты, в котором вы хотите, чтобы ваша строка

стриж

dateFormatter.dateFormat = "yyyy-MM-dd 'at' HH:mm"

Objective-C

dateFormatter.dateFormat = @"yyyy-MM-dd 'at' HH:mm";

3. Получите форматированную строку

стриж

let date = NSDate() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)

Swift 3

let date = Date() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)

Objective-C

NSDate *date = [NSDate date]; // your NSDate object
NSString *dateString = [dateFormatter stringFromDate:date];

Это даст результат примерно так: 2001-01-02 at 13:00

Заметка

Создание экземпляра NSDateFormatter - дорогостоящая операция, поэтому рекомендуется создать его один раз и повторно использовать, когда это возможно.

Полезное расширение для преобразования даты в строку.

extension Date {
        func toString() -> String {
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "MMMM dd yyyy"
            return dateFormatter.string(from: self)
        }
}

Полезные ссылки для быстрого создания даты- быстро-получение-человеко-читаемый-date-nsdateformatter .

Для создания форматов даты см. Шаблоны формата даты .

Преобразование NSDate, который состоит из часа и минуты (только) для полного NSDate

Существует много случаев, когда вы создали NSDate только с часовым и минутным форматом, то есть: 08:12, который возвращается с сервера в виде строки, и вы инициируете экземпляр NSDate только этими значениями.

Недостатком этой ситуации является то, что ваш NSDate почти полностью «голый», и вам нужно создать: день, месяц, год, второй и часовой пояс, чтобы этот объект «играл» с другими типами NSDate.

Для примера предположим, что hourAndMinute - это тип NSDate, который состоит из часового и минутного формата:

Objective-C

NSDateComponents *hourAndMinuteComponents = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute
                                                         fromDate:hourAndMinute];
NSDateComponents *componentsOfDate = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear
                                                                     fromDate:[NSDate date]];

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay: componentsOfDate.day];
[components setMonth: componentsOfDate.month];
[components setYear: componentsOfDate.year];
[components setHour: [hourAndMinuteComponents hour]];
[components setMinute: [hourAndMinuteComponents minute]];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone defaultTimeZone]];

NSDate *yourFullNSDateObject = [calendar dateFromComponents:components];

Теперь ваш объект является общей противоположностью тому, чтобы быть «голым».

UTC Смещение по времени от NSDate с помощью TimeZone

Здесь это рассчитает смещение времени UTC от текущих данных в желаемый часовой пояс.

+(NSTimeInterval)getUTCOffSetIntervalWithCurrentTimeZone:(NSTimeZone *)current forDate:(NSDate *)date  {
    NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
    NSInteger currentGMTOffset = [current secondsFromGMTForDate:date];
    NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date];
    NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset;
    return gmtInterval;
}

Получить тип цикла (12-часовой или 24-часовой)

Проверка, содержит ли текущая дата символ для AM или PM

Objective-C

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString *dateString = [formatter stringFromDate:[NSDate date]];
NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]];
NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]];
BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound);

Запрос типа временного цикла из NSDateFormatter

Objective-C

NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL is24h = containsA.location == NSNotFound;

Это использует специальную строку шаблона даты, называемую «j», которая, согласно спецификации ICU ...

[...] запрашивает предпочтительный формат часов для локали (h, H, K или k), как определено предпочтительным атрибутом элемента часов в дополнительных данных. [...] Обратите внимание, что использование «j» в скелете, переданном API, является единственным способом запросить скелет в качестве предпочтительного временного цикла локали (12-часовой или 24-часовой).

Последнее предложение важно. Это «единственный способ запросить скелет в качестве предпочтительного временного цикла языка». Поскольку NSDateFormatter и NSCalendar построены на библиотеке ICU, то здесь все верно.

Ссылка

Второй вариант был получен из этого ответа .

Получить NSDate из формата даты JSON "/ Date (1268123281843) /"

До Json.NET 4.5 даты были написаны с использованием формата Microsoft: «/ Date (1198908717056) /». Если ваш сервер отправляет дату в этом формате, вы можете использовать приведенный ниже код для его сериализации в NSDate:

Objective-C

(NSDate*) getDateFromJSON:(NSString *)dateString
{
    // Expect date in this format "/Date(1268123281843)/"
    int startPos = [dateString rangeOfString:@"("].location+1;
    int endPos = [dateString rangeOfString:@")"].location;
    NSRange range = NSMakeRange(startPos,endPos-startPos);
    unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue];
    NSLog(@"%llu",milliseconds);
    NSTimeInterval interval = milliseconds/1000;
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:interval];
    // add code for date formatter if need NSDate in specific format.
    return date;
}

Получить историческое время от NSDate (например: 5 лет назад, 2 года назад, 3 часа назад)

Это можно использовать в различных чат-приложениях, rss-каналах и социальных приложениях, где вам нужно иметь последние фиды с отметками времени:

Objective-C

- (NSString *)getHistoricTimeText:(NSDate *)since
{
    NSString *str;
    NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:since];
    if(interval < 60)
        str = [NSString stringWithFormat:@"%is ago",(int)interval];
    else if(interval < 3600)
    {
        int minutes = interval/60;
        str = [NSString stringWithFormat:@"%im ago",minutes];
    }
    else if(interval < 86400)
    {
        int hours =  interval/3600;
        
        str = [NSString stringWithFormat:@"%ih ago",hours];
    }
    else
    {
        NSDateFormatter *dateFormater=[[NSDateFormatter alloc]init];
        [dateFormater setLocale:[NSLocale currentLocale]];
        NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"MMM d, YYYY" options:0 locale:[NSLocale currentLocale]];
        [dateFormater setDateFormat:dateFormat];
        str = [dateFormater stringFromDate:since];
        
    }
    return str;
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow