어떻게 변환 할 것이다 NSString
“와 같은 01/02/10 으로”(의미 1 2010 년 2 월) NSDate
? 어떻게 NSDate
다시 끈으로 바꿀 수 있습니까?
답변
스위프트 4 이상
업데이트 : 2018
문자열을 날짜로
var dateString = "02-03-2017"
var dateFormatter = DateFormatter()
// This is important - we set our input date format to match our input string
// if the format doesn't match you'll get nil from your string, so be careful
dateFormatter.dateFormat = "dd-MM-yyyy"
//`date(from:)` returns an optional so make sure you unwrap when using.
var dateFromString: Date? = dateFormatter.date(from: dateString)
문자열 날짜
var formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
guard let unwrappedDate = dateFromString else { return }
//Using the dateFromString variable from before.
let stringDate: String = formatter.string(from: dateFromString)
스위프트 3
업데이트 : 2017 년 7 월 20 일
문자열을 NSDate로
var dateString = "02-03-2017"
var dateFormatter = DateFormatter()
// This is important - we set our input date format to match our input string
// if the format doesn't match you'll get nil from your string, so be careful
dateFormatter.dateFormat = "dd-MM-yyyy"
var dateFromString = dateFormatter.date(from: dateString)
NSDate에서 문자열로
var formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
let stringDate: String = formatter.string(from: dateFromString)
빠른
업데이트 날짜 : 2015 년 10 월 22 일
문자열을 NSDate로
var dateString = "01-02-2010"
var dateFormatter = NSDateFormatter()
// this is imporant - we set our input date format to match our input string
dateFormatter.dateFormat = "dd-MM-yyyy"
// voila!
var dateFromString = dateFormatter.dateFromString(dateString)
NSDate에서 문자열로
var formatter = NSDateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
let stringDate: String = formatter.stringFromDate(NSDate())
println(stringDate)
목표 -C
NSString에서 NSDate로
NSString *dateString = @"01-02-2010";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *dateFromString = [dateFormatter dateFromString:dateString];
NSDate를 NSString으로 변환 :
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"%@", stringDate);
답변
업데이트 2019 (Swift 4) :
그 Date
확장 을 만들었습니다 . NSDataDetector
대신을 사용 합니다 NSDateFormatter
.
// Just throw at it without any format.
var date: Date? = Date.FromString("02-14-2019 17:05:05")
꽤 즐거우 며 심지어 “Tomorrow at 5” 와 같은 것을 인식 합니다.
XCTAssertEqual(Date.FromString("2019-02-14"), Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019.02.14"), Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019/02/14"), Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019 Feb 14"), Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019 Feb 14th"), Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("20190214"), Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("02-14-2019"), Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("02.14.2019 5:00 PM"), Date.FromCalendar(2019, 2, 14, 17))
XCTAssertEqual(Date.FromString("02/14/2019 17:00"), Date.FromCalendar(2019, 2, 14, 17))
XCTAssertEqual(Date.FromString("14 February 2019 at 5 hour"), Date.FromCalendar(2019, 2, 14, 17))
XCTAssertEqual(Date.FromString("02-14-2019 17:05:05"), Date.FromCalendar(2019, 2, 14, 17, 05, 05))
XCTAssertEqual(Date.FromString("17:05, 14 February 2019 (UTC)"), Date.FromCalendar(2019, 2, 14, 17, 05))
XCTAssertEqual(Date.FromString("02-14-2019 17:05:05 GMT"), Date.FromCalendar(2019, 2, 14, 17, 05, 05))
XCTAssertEqual(Date.FromString("02-13-2019 Tomorrow"), Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019 Feb 14th Tomorrow at 5"), Date.FromCalendar(2019, 2, 14, 17))
다음과 같습니다.
extension Date
{
public static func FromString(_ dateString: String) -> Date?
{
// Date detector.
let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
// Enumerate matches.
var matchedDate: Date?
var matchedTimeZone: TimeZone?
detector.enumerateMatches(
in: dateString,
options: [],
range: NSRange(location: 0, length: dateString.utf16.count),
using:
{
(eachResult, _, _) in
// Lookup matches.
matchedDate = eachResult?.date
matchedTimeZone = eachResult?.timeZone
// Convert to GMT (!) if no timezone detected.
if matchedTimeZone == nil, let detectedDate = matchedDate
{ matchedDate = Calendar.current.date(byAdding: .second, value: TimeZone.current.secondsFromGMT(), to: detectedDate)! }
})
// Result.
return matchedDate
}
}
2014 업데이트 :
이를 위해 NSString 확장 을 만들었습니다 .
// Simple as this.
date = dateString.dateValue;
NSDataDetector 덕분에 많은 형식을 인식합니다.
'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>
eppz! kit 의 일부인 GitHub에서 카테고리 NSString + EPPZKit.h 를 가져옵니다 .
원래 답변 2013 :
문자열에 포함 된 날짜 형식에 대해 잘 모르거나 상관없이 NSDataDetector를 사용하여 날짜를 구문 분석하십시오 .
//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; }];
답변
고정 형식 날짜를 사용하는 경우 날짜 형식 기 로캘을로 설정해야합니다. "en_US_POSIX"
.
데이터 형식 가이드 에서 발췌
고정 형식 날짜로 작업하는 경우 먼저 날짜 형식 기의 로캘을 고정 형식에 적합한 것으로 설정해야합니다. 대부분의 경우 가장 적합한 로케일은 en_US_POSIX이며, 이는 사용자 및 시스템 환경 설정에 관계없이 미국 영어 결과를 산출하도록 특별히 설계된 로케일입니다
. en_US_POSIX도 시간에 따라 다릅니다 (미국은 미래의 시점에서 날짜 형식을 변경하는 방식을 변경하고 en_US는 새로운 동작을 반영하도록 변경하지만 en_US_POSIX는 변경되지 않음), 플랫폼 간 (en_US_POSIX는 iPhone에서 동일하게 작동 함) OS X에서와 마찬가지로 다른 플랫폼에서와 마찬가지로 OS).
스위프트 3 이상
extension Formatter {
static let customDate: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "dd/MM/yy"
return formatter
}()
static let time: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "HH:mm"
return formatter
}()
static let weekdayName: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "cccc"
return formatter
}()
static let month: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "LLLL"
return formatter
}()
}
extension Date {
var customDate: String {
return Formatter.customDate.string(from: self)
}
var customTime: String {
return Formatter.time.string(from: self)
}
var weekdayName: String {
return Formatter.weekdayName.string(from: self)
}
var monthName: String {
return Formatter.month.string(from: self)
}
}
extension String {
var customDate: Date? {
return Formatter.customDate.date(from: self)
}
}
용법:
// this will be displayed like this regardless of the user and system preferences
Date().customTime // "16:50"
Date().customDate // "06/05/17"
// this will be displayed according to user and system preferences
Date().weekdayName // "Saturday"
Date().monthName // "May"
사용자 정의 날짜를 구문 분석하고 날짜를 동일한 문자열 형식으로 다시 변환합니다.
let dateString = "01/02/10"
if let date = dateString.customDate {
print(date.customDate) // "01/02/10\n"
print(date.monthName) // customDate
}
다음은 필요에 따라 사용자 정의 할 수있는 모든 요소입니다.
답변
NSString에 카테고리를 추가하지 않는 이유는 무엇입니까?
// NSString+Date.h
@interface NSString (Date)
+ (NSDate*)stringDateFromString:(NSString*)string;
+ (NSString*)stringDateFromDate:(NSDate*)date;
@end
// NSString+Date.m
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];
NSDate *date = [dateFormatter dateFromString:stringDate ];
[dateFormatter release];
+ (NSDateFormatter*)stringDateFormatter
{
static NSDateFormatter* formatter = nil;
if (formatter == nil)
{
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];
}
return formatter;
}
+ (NSDate*)stringDateFromString:(NSString*)string
{
return [[NSString stringDateFormatter] dateFromString:string];
}
+ (NSString*)stringDateFromDate:(NSDate*)date
{
return [[NSString stringDateFormatter] stringFromDate:date];
}
// Usage (#import "NSString+Date.h") or add in "YOUR PROJECT".pch file
NSString* string = [NSString stringDateFromDate:[NSDate date]];
NSDate* date = [NSString stringDateFromString:string];
답변
연도를 나타내는 데 “10”을 사용하는 것은 좋지 않습니다. 1910, 1810 등일 수 있기 때문입니다. 아마도 4 자리 숫자를 사용해야합니다.
날짜를 다음과 같이 변경할 수 있다면
yyyymmdd
그런 다음 다음을 사용할 수 있습니다.
// Convert string to date object
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyyMMdd"];
NSDate *date = [dateFormat dateFromString:dateStr];
// Convert date object to desired output format
[dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
dateStr = [dateFormat stringFromDate:date];
[dateFormat release];
답변
NSString *dateStr = @"Tue, 25 May 2010 12:53:58 +0000";
// Convert string to date object
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"EE, d LLLL yyyy HH:mm:ss Z"];
NSDate *date = [dateFormat dateFromString:dateStr];
[dateFormat release];
답변
// Convert string to date
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyyMMdd"];
NSDate *date = [dateFormat dateFromString:dateStr];
// Convert Date to string
[dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
dateStr = [dateFormat stringFromDate:date];
[dateFormat release];