เนื่องจากนี่เป็นคำตอบที่ได้รับความนิยมมากที่สุดของฉันฉันจะพยายามแก้ไขเพื่อให้มีข้อมูลเพิ่มเติมเล็กน้อย
แม้จะมีชื่อNSDateของตัวมันเองและในตัวของมันเองเพียงทำเครื่องหมายจุดในเวลาที่เครื่องไม่ได้เป็นวันที่ ไม่มีความสัมพันธ์กันระหว่างเวลาที่กำหนดโดยNSDatea และปีเดือนหรือวัน เพื่อที่คุณจะต้องอ้างถึงปฏิทิน เวลาใดก็ตามที่ระบุจะส่งคืนข้อมูลวันที่ที่แตกต่างกันตามปฏิทินที่คุณกำลังดู (วันที่จะไม่เหมือนกันทั้งในปฏิทินเกรโกเรียนและยิวเช่น) และในขณะที่ปฏิทินเกรกอเรียนเป็นปฏิทินที่ใช้กันอย่างแพร่หลายที่สุดใน โลก - ฉันสมมติว่า - เรามีอคติเล็กน้อยที่NSDateควรใช้มันเสมอ NSDateโชคดีที่มันเป็นพรรคสองฝ่าย
การรับวันที่และเวลาจะต้องผ่านNSCalendarตามที่คุณพูดถึง แต่มีวิธีที่ง่ายกว่าในการทำสิ่งนี้:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
ที่สร้างNSDateComponentsวัตถุที่มีวันเดือนและปีจากปฏิทินระบบปัจจุบันสำหรับวันปัจจุบัน ( หมายเหตุ:นี่ไม่จำเป็นต้องเป็นปฏิทินที่ผู้ใช้ระบุในปัจจุบันแต่เป็นเพียงระบบเริ่มต้น)
แน่นอนถ้าคุณใช้ปฏิทินหรือวันที่อื่นคุณสามารถเปลี่ยนได้อย่างง่ายดาย รายการปฏิทินที่มีอยู่และหน่วยปฏิทินสามารถพบได้ในการอ้างอิงระดับNSCalendar ข้อมูลเพิ่มเติมเกี่ยวกับNSDateComponentsสามารถพบได้ในการอ้างอิงระดับNSDateComponents
สำหรับการอ้างอิงการเข้าถึงแต่ละองค์ประกอบจากNSDateComponentsค่อนข้างง่าย:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
คุณต้องระวัง: NSDateComponentsจะไม่มีข้อมูลที่ถูกต้องสำหรับเขตข้อมูลใด ๆ ที่คุณขอเว้นแต่คุณจะสร้างข้อมูลที่ถูกต้องนั้นขึ้นมา (เช่นการร้องขอNSCalendarเพื่อให้ข้อมูลนั้นกับNSCalendarUnits) NSDateComponentsไม่มีข้อมูลอ้างอิงในตัวมันเป็นเพียงโครงสร้างอย่างง่ายที่เก็บหมายเลขไว้ให้คุณเข้าถึง หากคุณต้องการได้รับยุคเช่นจากNSDateComponentsคุณจะต้องป้อนวิธีการสร้างจากNSCalendarกับNSCalendarUnitEraธง