Получить дату текущего месяца в компонентах даты - PullRequest
0 голосов
/ 06 июля 2018

Я получаю NSDateComponents даты 2018-06-01 00:00:00 +0000 вот так

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth|NSCalendarUnitYear |NSCalendarUnitHour | NSCalendarUnitMinute fromDate:date];
[components setTimeZone:[NSTimeZone timeZoneWithAbbreviation: @"UTC"]];
 NSInteger month =[components month];

Когда я печатаю значение компонентов, я получаю это значение.

    TimeZone: GMT (GMT) offset 0
    Calendar Year: 2018
    Month: 5
    Leap month: no
    Day: 31
    Hour: 21
    Minute: 0

Мой ожидаемый выход должен быть

    TimeZone: GMT (GMT) offset 0
    Calendar Year: 2018
    Month: 6
    Leap month: no
    Day: 1
    Hour: 0
    Minute: 0

Как правильно узнать значение месяца?

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Как создать исходный объект date? Когда я пробую эту настройку, все работает как положено:

NSString *dateString = @"2018-06-01 00:00:00 +0000";

NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss Z";
dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

NSDate *date = [dateFormatter dateFromString:dateString];
NSCalendar *calendar = NSCalendar.currentCalendar;
NSDateComponents *components = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitHour | NSCalendarUnitMinute fromDate:date];

NSLog(@"Before: %@", components);
/*
 Before: <NSDateComponents: 0x604000158e10>
 Calendar Year: 2018
 Month: 6
 Leap month: no
 Day: 1
 Hour: 2
 Minute: 0
 */

components.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];

NSLog(@"After: %@", components);
/*
 After: <NSDateComponents: 0x604000158e10>
 TimeZone: GMT (GMT) offset 0
 Calendar Year: 2018
 Month: 6
 Leap month: no
 Day: 1
 Hour: 2
 Minute: 0
 */
0 голосов
/ 06 июля 2018

При использовании NSCalendar components:fromDate: результаты основаны на текущем часовом поясе календаря, который по умолчанию равен локальному часовому поясу пользователя.

Ваша попытка установить результирующие компоненты 'timeZone не изменяет текущие компоненты. Это повлияет только на то, как компоненты будут интерпретироваться, если вы использовали компоненты для создания нового NSDate.

Предполагая, что ваша цель - получить компоненты date по времени UTC, а не по местному времени, вам необходимо установить timeZone в календаре, прежде чем получать компоненты из date.

NSDate *date = // your date
NSCalendar *calendar = NSCalendar.currentCalendar;
calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
NSDateComponents *components = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitHour | NSCalendarUnitMinute fromDate:date];
NSLog(@"UTC Components: %@", components);

Но имейте в виду, что вы должны понимать, какой часовой пояс вы действительно хотите здесь. Убедитесь, что вы действительно хотите часовой пояс UTC. Не используйте UTC только потому, что он соответствует выводу NSLog(@"Date: %@", date);. В этом журнале указывается дата в формате UTC.

0 голосов
/ 06 июля 2018

Сначала нужно получить дату последнего месяца.

extension Date {

   //it will give the date of last month
   var previousMonthDate: Date {
      return Calendar.current.date(byAdding: .month, value: -1, to: self)!
   } 
}

Получить компоненты даты от даты

let dt = Date()
let components = Calendar.current.dateComponents([.year, .month, .day], from: dt.previousMonthDate)
print(components.day ?? 0)
print(components.month ?? 0)
print(components.year ?? 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...