iPhone OS: Bagaimana cara membuat NSDate untuk tanggal tertentu?

98

Sepertinya hal yang sederhana tetapi saya tidak dapat menemukan cara untuk melakukannya.

Akan sangat bagus untuk melihat beberapa metode berbeda.

nickthedude
sumber

Jawaban:

211

@ Jawaban Chuck benar, dan arahkan saya ke kode berikut. Kupikir aku akan berbagi:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
Oded Ben Dov
sumber
7
Catatan ada juga setHour, setMinute, setSecond, dll untuk lebih halus granularity.
devios1
19

Anda bisa menggunakan ini

NSString *dateString = @"03-Sep-11";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd-MMM-yy";
NSDate *date = [dateFormatter dateFromString:dateString];

Semoga ini bisa membantu Anda.

Kamleshwar
sumber
Berhati-hatilah saat menggunakan fungsi "dateFromString" - Saya menemukan bahwa dengan beberapa tanggal yang benar-benar valid, itu akan gagal total. Lihat posting saya di bawah untuk cara alternatif parsing string tanggal.
Mike Gledhill
Cara Oded Ben menyebutkan juga merupakan cara terbaik lainnya ..... NSDateComponents * comps = [[NSDateComponents alokasi] init]; [comps setDay: 10]; [comps setMonth: 10]; [comps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar
16

Jika Anda berbicara tentang tanggal kalender tertentu daripada tanggal UNIXy, Anda mungkin menginginkan NSCalendar's dateFromComponents:.

Membuang
sumber
9

Contoh Cepat

Contoh seringkali merupakan cara termudah untuk belajar. Berikut ini beberapa contohnya.

Sekarang

Yang ini paling mudah.

let currentDateTime = Date()

20 Februari 2017

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 2017
dateComponents.month = 2
dateComponents.day = 20

// Create date from components
let userCalendar = Calendar.current // user calendar
let dateThisPostWasUpdated = userCalendar.date(from: dateComponents)

1 April 1976

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1976
dateComponents.month = 4
dateComponents.day = 1

// Create date from components
let userCalendar = Calendar.current // user calendar
let appleFoundedDate = userCalendar.date(from: dateComponents)

Butuh detail lebih lanjut ...?

Ada cara lain untuk membuat tanggal juga. Jika Anda ingin mempelajarinya, serta cara menampilkan tanggal, lihat jawaban lengkap saya .

Suragch
sumber
8

Lihat dokumentasi untuk NSDate . Anda dapat menggunakan dateFromString:metode NSDateFormatteratau dateFromComponents:metode NSCalendar.

zoul
sumber
Saya terus mendapatkan tanggal ini: "1969-12-31 16:00:00" -0800 saat menggunakan tanggal dari string
nickthedude
NSDateFormatter * dateFormatter = [[NSDateFormatter alokasi] init]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "Jan 2, 2001"]; NSLog (@ "% @", [deskripsi captureStartDate]); keluaran: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude
Mungkin Anda perlu mengatur beberapa parameter pada tanggal yang diformat bukan polos init?
zoul
3

Saya menemukan utas ini saat mencari jawaban untuk pertanyaan ini, tetapi kemudian saya menemukan contoh yang bagus di salah satu buku Pemrograman C Tujuan Peternakan Big Nerd. Penghargaan untuk mereka, bukan saya.

  NSDateComponents *myBDay  =[[NSDateComponents alloc] init];
    [myBDay setDay:22];
    [myBDay setMonth: 04];
    [myBDay setYear: 1984];
    [myBDay setHour:9];
    [myBDay setMinute:25];
    [myBDay setSecond:35];

    NSCalendar *g = [[ NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *dateOfBirth = [g dateFromComponents:myBDay];
Lev Chlumov
sumber
2

Itu konyol, bukan?

Pertengahan 2013 lalu Apple masih belum menyediakan cara sederhana untuk menetapkan nilai NSDate.

Selama proyek iPad saya saat ini, saya tidak percaya saya harus menghentikan produktivitas untuk sementara waktu untuk menulis kelas pembantu saya sendiri untuk mendapatkan nilai Tahun dari NSDate. Maksudku, ayolah, ini hal mendasar.

Bagaimanapun, inilah kelas helper yang saya gunakan dalam proyek saya, untuk mengubah string menjadi nilai NSDate:

@implementation DateHelper

+(NSDate*)parseDateString:(NSString *)dateString
{
    NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
    [rfc3339TimestampFormatterWithTimeZone setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"MMM dd, yyyy"];

    NSDate *theDate = nil;
    NSError *error = nil;
    if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
        NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
    }

    return theDate;
}

@end

Dengan menggunakan kode ini, Anda dapat menetapkan nilai NSDate menggunakan sesuatu seperti:

NSDate* date = [DateHelper parseDateString:@"Jul 16, 2013"];

Catatan: fungsi ini didasarkan pada kode yang diambil dari sini: https://stackoverflow.com/a/3968411/391605

Solusi saya adalah menggunakan kode berikut, tetapi saya menemukan bahwa kadang - kadang , itu tidak dapat diurai, dan akan mengembalikan nol .

//  Take a date string in the format "Oct 23, 2013", and convert it into a NSDate value
//  THIS DOESN'T WORK !  DON'T TRUST THIS CODE !!
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM dd, yyyy"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate* date = [formatter dateFromString:dateString];

Saya ingat itu gagal total pada "Okt 12, 2012" ... itulah sebabnya saya menyerah dan menggunakan fungsi "parseDateString" yang lebih rumit seperti yang ditunjukkan di atas.

Maksud saya adalah ... hati-hati.

Beberapa fungsi NSDate yang sangat dasar tidak berfungsi dengan baik ...

Mike Gledhill
sumber