iPhone OS: Làm cách nào để tạo NSDate cho một ngày cụ thể?


Câu trả lời:


211

Câu trả lời của @ Chuck là đúng, và hãy dẫn tôi đến đoạn mã sau. Tôi nghĩ tôi sẽ chia sẻ:

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

7
Lưu ý cũng có setHour, setMinute, setSecond, vv cho mịn granularity.
defos1

19

Bạn có thể sử dụng cái này

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

Hy vọng rằng cái này sẽ giúp đc bạn.


Hãy cẩn thận khi sử dụng chức năng "dateFromString" - Tôi nhận thấy rằng với một số ngày hoàn toàn hợp lệ, nó sẽ thất bại thảm hại. Xem bài đăng của tôi bên dưới để biết một cách khác để phân tích chuỗi ngày.
Mike Gledhill

Cách Oded Ben đề cập đến cũng là một cách tốt nhất khác ..... NSDateComponents * comps = [[NSDateComponents CẤP] init]; [comps setDay: 10]; [comps setMonth: 10]; [comps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar

16

Nếu bạn đang nói về một ngày lịch cụ thể thay vì một ngày UNIXy, bạn có thể muốn NSCalendar dateFromComponents:.


9

Ví dụ về Swift

Ví dụ thường là cách dễ nhất để học. Dưới đây là một vài ví dụ.

Hiện nay

Đây là cái dễ nhất.

let currentDateTime = Date()

20 tháng 2, 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 tháng 4 năm 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)

Cần thêm chi tiết ...?

Có nhiều cách khác để tạo ngày tháng. Nếu bạn muốn tìm hiểu những điều đó, cũng như cách hiển thị ngày tháng, hãy xem câu trả lời đầy đủ hơn của tôi .


8

Xem tài liệu về NSDate . Bạn có thể sử dụng dateFromString:phương pháp của NSDateFormatterhoặc dateFromComponents:phương pháp của NSCalendar.


Tôi tiếp tục nhận được ngày này: "1969-12-31 16:00:00" -0800 khi sử dụng ngày từ chuỗi
nickthedude

NSDateFormatter * dateFormatter = [[NSDateFormatter CẤP] init]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "Ngày 2 tháng 1 năm 2001"]; NSLog (@ "% @", [mô tả captureStartDate]); sản lượng: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude

Có thể bạn cần đặt một số thông số về ngày được định dạng thay vì đơn giản init?
zoul

3

Tôi đã tìm thấy chủ đề này khi đang tìm câu trả lời cho câu hỏi này nhưng sau đó tôi tìm thấy một ví dụ điển hình trong cuốn sách Lập trình mục tiêu-C Big Nerd Ranch của tôi. Tín dụng cho họ, không phải tôi.

  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

Thật là nực cười phải không?

Giữa năm 2013 và Apple vẫn chưa cung cấp một cách đơn giản để đặt giá trị NSDate.

Trong dự án iPad hiện tại của mình, tôi không thể tin được rằng mình đã phải ngừng năng suất một lúc để viết lớp trợ giúp của riêng mình để nhận được giá trị Năm từ NSDate. Ý tôi là, thôi nào, đây là những thứ cơ bản.

Dù sao, đây là lớp trợ giúp mà tôi đã sử dụng trong dự án của mình, để chuyển đổi một chuỗi thành giá trị 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

Sử dụng mã này, bạn có thể đặt giá trị NSDate bằng cách sử dụng một cái gì đó như:

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

Lưu ý: chức năng này dựa trên mã lấy từ đây: https://stackoverflow.com/a/3968411/391605

Giải pháp của tôi sử dụng đoạn mã sau, nhưng tôi thấy rằng đôi khi , nó không phân tích cú pháp và sẽ trả về nil .

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

Tôi nhớ nó đã thất bại thảm hại vào "ngày 12 tháng 10 năm 2012" ... đó là lý do tại sao tôi đã từ bỏ và sử dụng hàm "parseDateString" phức tạp hơn được hiển thị ở trên.

Quan điểm của tôi là ... hãy cẩn thận.

Một số chức năng NSDate rất cơ bản không hoạt động bình thường ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.