เนื่องจากนี่เป็นคำตอบที่ได้รับความนิยมมากที่สุดของฉันฉันจะพยายามแก้ไขเพื่อให้มีข้อมูลเพิ่มเติมเล็กน้อย
แม้จะมีชื่อNSDate
ของตัวมันเองและในตัวของมันเองเพียงทำเครื่องหมายจุดในเวลาที่เครื่องไม่ได้เป็นวันที่ ไม่มีความสัมพันธ์กันระหว่างเวลาที่กำหนดโดยNSDate
a และปีเดือนหรือวัน เพื่อที่คุณจะต้องอ้างถึงปฏิทิน เวลาใดก็ตามที่ระบุจะส่งคืนข้อมูลวันที่ที่แตกต่างกันตามปฏิทินที่คุณกำลังดู (วันที่จะไม่เหมือนกันทั้งในปฏิทินเกรโกเรียนและยิวเช่น) และในขณะที่ปฏิทินเกรกอเรียนเป็นปฏิทินที่ใช้กันอย่างแพร่หลายที่สุดใน โลก - ฉันสมมติว่า - เรามีอคติเล็กน้อยที่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
เพื่อให้ข้อมูลนั้นกับNSCalendarUnit
s) NSDateComponents
ไม่มีข้อมูลอ้างอิงในตัวมันเป็นเพียงโครงสร้างอย่างง่ายที่เก็บหมายเลขไว้ให้คุณเข้าถึง หากคุณต้องการได้รับยุคเช่นจากNSDateComponents
คุณจะต้องป้อนวิธีการสร้างจากNSCalendar
กับNSCalendarUnitEra
ธง