Como obter o dia, mês e ano NSDate em formato inteiro?

95

Desejo obter os componentes de dia, mês e ano NSDateem forma inteira, ou seja, se a data for 1/2/1988, devo obter 1, 2 e 1988 separadamente como um inteiro. Como posso fazer isso no iOS? Eu encontrei uma pergunta semelhante, mas o método descriptionWithCalendarFormat: dá um aviso e parece estar obsoleto agora.

Iogue
fonte
Consulte Converter NSDate em um inteiro se apenas um único inteiro for necessário para NSDate.
Suragch

Respostas:

223

Olha Você aqui,

NSDate *currentDate = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:currentDate]; // Get necessary date components

 [components month]; //gives you month
 [components day]; //gives you day
 [components year]; // gives you year

Você pode usar NSDateComponents para isso, conforme descrito acima.

Visite esta página para obter detalhes.

Espero que ajude.

Janak Nirmal
fonte
1
+1 para fornecer o código para a resposta correta. Mas você deve mencionar que as informações vêm de NSDateComponents, não de NSDateFormatter.
Black Frog
@Black Peça desculpas por isso. Atualizei minha resposta.
Janak Nirmal
1
@Janak Nirmal Escreva um ponto específico que você não poderia explicar como obter o formato de string para dia, mês, ano, um usuário não conseguia entender.
Anu
1
@JanakNirmal você deve explicar como obter o valor exato.
Annu
3
Para evitar avisos de descontinuação: NSDateComponents * components = [calendar components: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate: currentDate];
Rodrigo Pinto
17

Sim, pelo uso de NSCalendar, porém, acho que isso fará seu trabalho funcionar.

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];
NSInteger day = [components day];    
NSInteger month = [components month];
NSInteger year = [components year];
user755278
fonte
13

Rápido

let components = NSCalendar.currentCalendar().components([.Day, .Month, .Year], fromDate: self)
let day = components.day
let month = components.month
let year = components.year

Por conveniência, você pode colocar isso em uma NSDateextensão e fazê-lo retornar uma tupla:

extension NSDate: Comparable {

    var dayMonthYear: (Int, Int, Int) {
        let components = NSCalendar.currentCalendar().components([.Day, .Month, .Year], fromDate: self)
        return (components.day, components.month, components.year)
    }
}

Agora você tem que escrever apenas:

let (day, month, year) = date.dayMonthYear

Se você quiser, por exemplo, obter apenas o ano, pode escrever:

let (_, _, year) = date.dayMonthYear
Ixx
fonte
2
Eu gosto da sua abordagem. Uma sugestão é que para mudar a nomenclatura parâmetro para (day: Int, month: Int, year: Int), dessa forma você pode usar o resultado usando date.dayMonthYear.day, date.dayMonthYear.month, date.dayMonthYear.year.
Paul Peelen
9

Você pode usar NSDateComponents para conseguir isso,

NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSDate *currDate = [NSDate date];
NSDateComponents *dComp = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) 
                                      fromDate:currDate];

int day = [dComp day];
int month = [dComp month];
int year = [dComp year];
Desenvolvedor móvel iOS Android
fonte
8

Coloque-o em uma extensão e viva sua vida 🍸🏖

extension Date{
    var day:Int {return Calendar.current.component(.day, from:self)}
    var month:Int {return Calendar.current.component(.month, from:self)}
    var year:Int {return Calendar.current.component(.year, from:self)}
}
Date().day//22
Date().month//4
Date().year//2017

Swift 3.0 (é uma iteração de respostas anteriores, mas resolve para todos os seus projetos de aplicativos futuros)

eonista
fonte
7

Para aqueles que apenas copiam e colam diretamente da web, como eu, esta é uma pequena atualização para iOS 8

NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];
[components day]; //Day
[components month];//Month
[components year];//Year

A diferença é NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnitque foram descontinuados

Jansen
fonte
2

Você pode tentar isso ...

Mycal = [NSCalendar currentCalendar];
today = [NSDate date];
compA =[Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];     
FirstDateofMonth=[today dateByAddingTimeInterval:([compA day]-1)*(-24*60*60)];

compA =[Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:FirstDateofMonth];
today = FirstDateofMonth;
compA = [Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];
[compA setMonth:([compA month])];
[self DrawMonthInPortraitView];
[compA retain];
Dinesh_
fonte
1
NSDate *currentDate = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:currentDate]; // Get necessary date components

[components month]; //gives you month
[components day]; //gives you day
[components year]; // gives you year

NSString *temp=[NSString stringWithFormat:@"Months:%d Day:%d Year:%d",[components month],  [components day],[components year]];
NSLog(@"%@",temp);
ano
fonte
1
let date = Date()
let calendar = Calendar.current

let year = calendar.component(.year, from: date)
let month = calendar.component(.month, from: date)
let day = calendar.component(.day, from: date)
print("hours = \(year):\(month):\(day)")
Oscarr
fonte
1
Embora este código possa responder à pergunta, fornecer contexto adicional sobre por que e / ou como este código responde à pergunta melhora seu valor a longo prazo.
Pato Donald