iPhone OS: ฉันจะสร้าง NSDate สำหรับวันที่ที่ระบุได้อย่างไร


คำตอบ:


211

คำตอบของ @ Chuck ถูกต้องและนำฉันไปสู่รหัสต่อไปนี้ คิดว่าฉันจะแบ่งปัน:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];

8
หมายเหตุนอกจากนี้ยังมีsetHour, setMinute, setSecondฯลฯ สำหรับเมล็ดปลีกย่อย
devios1

19

คุณสามารถใช้สิ่งนี้

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

หวังว่านี่จะช่วยคุณได้


โปรดใช้ความระมัดระวังในการใช้ฟังก์ชัน "dateFromString" - ฉันพบว่าด้วยวันที่ที่ถูกต้องสมบูรณ์บางวันมันจะล้มเหลวอย่างน่าอนาถ ดูโพสต์ของฉันด้านล่างสำหรับวิธีอื่นในการแยกวิเคราะห์สตริงวันที่
Mike Gledhill

วิธีที่ Oded Ben กล่าวถึงก็เป็นอีกวิธีที่ดีที่สุด ..... NSDateComponents * comps = [[NSDateComponents จัดสรร] init] [comps setDay: 10]; [คอมพ์ setMonth: 10]; [comps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar

16

หากคุณกำลังพูดถึงปฏิทินวันที่เฉพาะเจาะจงมากกว่าวัน UNIXy คุณอาจต้องการ dateFromComponents:NSCalendar


9

ตัวอย่างรวดเร็ว

ตัวอย่างมักเป็นวิธีที่ง่ายที่สุดในการเรียนรู้ นี่คือตัวอย่างบางส่วน

ตอนนี้

อันนี้ง่ายที่สุด

let currentDateTime = Date()

20 กุมภาพันธ์ 2560

// 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 เมษายน 2519

// 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)

ต้องการรายละเอียดเพิ่มเติม ... ?

มีวิธีอื่นในการสร้างวันที่ด้วยเช่นกัน หากคุณต้องการที่จะเรียนรู้เหล่านั้นเช่นเดียวกับวิธีการแสดงวันที่แล้วดูคำฟูลเลอร์ของฉัน


8

โปรดดูเอกสารสำหรับNSDate คุณสามารถใช้dateFromString:วิธีการNSDateFormatterหรือวิธีการdateFromComponents:NSCalendar


ฉันได้รับวันที่นี้เรื่อย ๆ : "1969-12-31 16:00:00" -0800 เมื่อใช้วันที่จากสตริง
nickthedude

NSDateFormatter * dateFormatter = [[NSDateFormatter จัดสรร] init]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "2 ม.ค. 2544"]; NSLog (@ "% @", [CapturedStartDate description]); output: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude

บางทีคุณอาจต้องตั้งค่าพารามิเตอร์บางอย่างในรูปแบบวันที่แทนที่จะเป็นแบบธรรมดาinit?
zoul

3

ฉันพบหัวข้อนี้ในขณะที่กำลังมองหาคำตอบสำหรับคำถามนี้ แต่แล้วฉันก็พบตัวอย่างที่ดีในหนังสือการเขียนโปรแกรม Big Nerd Ranch Objective-C เล่มหนึ่งของฉัน ให้เครดิตกับพวกเขาไม่ใช่ฉัน

  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];

2

มันไร้สาระใช่มั้ย?

กลางปี ​​2013 และ Apple ยังคงไม่ได้ให้วิธีง่ายๆในการตั้งค่า NSDate

ระหว่างโปรเจ็กต์ iPad ปัจจุบันของฉันฉันไม่อยากเชื่อเลยว่าฉันต้องหยุดการทำงานไปชั่วขณะเพื่อเขียนคลาสตัวช่วยของตัวเองเพื่อรับค่าปีจาก NSDate ฉันหมายความว่ามานี่เป็นเรื่องพื้นฐาน

อย่างไรก็ตามนี่คือคลาสผู้ช่วยที่ฉันใช้ในโปรเจ็กต์ของฉันเพื่อแปลงสตริงเป็นค่า 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

เมื่อใช้รหัสนี้คุณสามารถตั้งค่า NSDate โดยใช้สิ่งต่างๆเช่น:

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

หมายเหตุ: ฟังก์ชั่นนี้เป็นไปตามรหัสที่นำมาจากที่นี่: https://stackoverflow.com/a/3968411/391605

วิธีการแก้ปัญหาของฉันได้รับการใช้รหัสต่อไป แต่ผมพบว่าบางครั้งมันก็จะไม่แยกและจะกลับมาเป็นศูนย์

//  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];

ฉันจำได้ว่ามันล้มเหลวอย่างน่าอนาถเมื่อ "12 ต.ค. 2555" ... ซึ่งเป็นสาเหตุที่ฉันยอมแพ้และใช้ฟังก์ชัน "parseDateString" ที่ซับซ้อนกว่าที่แสดงไว้ด้านบน

ประเด็นของฉันคือ ... ระวัง

ฟังก์ชัน NSDate พื้นฐานบางอย่างทำงานไม่ถูกต้อง ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.