2009-08-30 17 views
38

tôi nhận được một chuỗi chứa ngày hiện tại bằng cách sử dụng này:NSString để NSDate

NSString *date = [[NSDate date] description]; 

Tại một điểm khác nhau Tôi muốn lấy ngày từ chuỗi này và tôi đã sử dụng đoạn mã sau:

[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
//[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehaviorDefault]; 
[dateFormatter setDateFormat:@"YYYY-MM-DD HH:MM:SS ±HHMM"]; 

NSDate *dateFromString = [[NSDate alloc] init]; 
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 

Tôi nhận được dateFromStringnil 0x0. Tôi đang làm gì sai?

Trả lời

64

Bạn không thể tạo ra cú pháp chuỗi định dạng và mong đợi nó hoạt động; bạn cần phải sử dụng định dạng tài liệu. (Nghiêm túc, "MM" có nghĩa là "tháng", "phút" và "phút bù giờ GMT" tất cả cùng một lúc?)

documentation chỉ ra, 10.4 định dạng sử dụng Unicode format strings.

Hãy thử "yyyy-MM-dd HH: mm: ss ZZZ" để thay thế.

Ngoài ra, nguồn Mục tiêu-C là ASCII. Không đặt các ký tự như ± vào đó và mong đợi nó hoạt động trong bất kỳ ngữ cảnh nào; thay vào đó, hãy sử dụng các tệp chuỗi.

+1

Chỉ hoạt động tốt – Minar

+0

Unicode UTF-8 hoạt động tốt trong nguồn. – Jonny

+1

Điều đó đã thay đổi khi di chuyển sang các trình biên dịch mới hơn kể từ khi tôi viết câu trả lời gốc của mình (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html#//apple_ref/doc/ uid/20000148-SW1). –

7

Ngoài ra, dateFromString: trả về một NSDate autoreleased, vì vậy:

NSDate *dateFromString = [[NSDate alloc] init]; // <- non freed instance 
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; // <- new autoreleased instance 
.... 
[dateFromString release]; // <- wrong 

Bạn có thể muốn:

//NSDate *dateFromString = [[NSDate alloc] init]; 
NSDate *dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 
.... 
//[dateFromString release]; // dateFromString is autoreleased 

Hy vọng điều này có thể tiết kiệm một ai đó :)

+0

dateFormatter là gì? –

+0

Từ chính câu hỏi: NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; – grilix

-1

Như đã trả lời ở trên, rằng là những gì xảy ra khi bạn phát minh ra một sytax mới.

Dựa trên Apple NSDateFormatter Class Reference tài liệu

Có rất nhiều thuộc tính bạn có thể nhận và thiết lập vào một ngày phong cách formatter ... Bạn được khuyến khích, tuy nhiên, không thay đổi các thiết lập cá nhân . Thay vào đó bạn nên chấp nhận các thiết lập mặc định thành lập ngày khởi và xác định định dạng sử dụng setDateStyle :, setTimeStyle:

Đây là đặc biệt quan trọng đối với đầu ra, đó là khác nhau cho mỗi miền địa phương. Theo mặc định, NSDateFormatter sẽ quan sát cài đặt ngôn ngữ của người dùng hiện tại. Vì vậy, cùng một NSD có thể là 22.11.2011 18:33:19 hoặc Nov 22, 2011 6:33:19 PM hoặc 2011-11-22 下午6:33:19 hoặc thậm chí २२-११-२०११ ६:३३:१९ अपराह्, tất cả cho cùng một đầu vào và có cùng mã.

Hãy xem xét ví dụ mã này

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

// ShortStyle used: 11/23/37 3:30pm 
NSString *dateString = [dateFormatter stringFromDate:date]; 

Kiểm tra tài liệu của Apple cho các phong cách khác nhau của NSDateFormatterStyle hay này excellent tutorial

2

Bạn có thể kiểm tra TouchTime.

https://github.com/jheising/TouchTime.

Đây là cổng trực tiếp của hàm strtotime tuyệt vời trong PHP trong 5.4 cho Cocoa và iOS. Nó sẽ mất nhiều định dạng tùy ý của chuỗi ngày tháng hoặc thời gian và chuyển đổi nó thành một NSDate.

Hy vọng nó hoạt động và tận hưởng!

2

Thực hiện một số Tiện ích mở rộng NSString cho điều đó.

// Simple as this. 
date = dateString.dateValue; 

Nhờ có NSDataDetector, nó nhận ra rất nhiều định dạng.

// Tested in GMT+1 (Hungary). 
@"2014-01-16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014.01.16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014/01/16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014 Jan 16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014 Jan 16th" dateValue is <2014-01-16 11:00:00 +0000> 
@"20140116" dateValue is <2014-01-16 11:00:00 +0000> 
@"01-16-2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01.16.2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01/16/2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"16 January 2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01-16-2014 17:05:05" dateValue is <2014-01-16 16:05:05 +0000> 
@"01-16-2014 T 17:05:05 UTC" dateValue is <2014-01-16 17:05:05 +0000> 
@"17:05, 1 January 2014 (UTC)" dateValue is <2014-01-01 16:05:00 +0000> 

Một phần của eppz!kit, lấy danh mục NSString+EPPZKit.h từ GitHub.


ĐÁP ORIGINAL: Cho dù bạn không chắc chắn (hoặc chỉ cần không quan tâm) về định dạng ngày chứa trong chuỗi, sử dụng NSDataDetector cho ngày phân tích cú pháp.

//Role players. 
NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700"; 
__block NSDate *detectedDate; 

//Detect. 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil]; 
[detector enumerateMatchesInString:dateString 
          options:kNilOptions 
          range:NSMakeRange(0, [dateString length]) 
         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
{ detectedDate = result.date; }];