iOS에서 ISO 8601 날짜를 얻으려면 어떻게합니까?
2004-02-12T15:19:21+00:00
PHP를 통해 ISO 8601 날짜 문자열 (예 :)을 얻는 것은 쉽지만 date('c')
Objective-C (iPhone)에서는 어떻게 얻습니까? 비슷한 짧은 방법이 있습니까?
내가 찾은 먼 길은 다음과 같습니다 .
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
너무 중심적인 무언가를위한 엄청나게 많은 리그 마롤처럼 보입니다.
사용 NSDateFormatter
:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:enUSPOSIXLocale];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
[dateFormatter setCalendar:[NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]];
NSDate *now = [NSDate date];
NSString *iso8601String = [dateFormatter stringFromDate:now];
그리고 스위프트에서 :
let dateFormatter = DateFormatter()
let enUSPosixLocale = Locale(identifier: "en_US_POSIX")
dateFormatter.locale = enUSPosixLocale
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
dateFormatter.calendar = Calendar(identifier: .gregorian)
let iso8601String = dateFormatter.string(from: Date())
iOS 10에서는 NSISO8601DateFormatter
이를 처리 할 수 있는 새로운 클래스가 도입되었습니다 . Swift 3을 사용하는 경우 코드는 다음과 같습니다.
let formatter = ISO8601DateFormatter()
let date = formatter.date(from: "2016-08-26T12:39:00Z")
let string = formatter.string(from: Date())
매디의 답변을 보완하기 위해 표준 시간대 형식은 단일 "Z"(RFC 822 형식) 대신 ISO 8601의 "ZZZZZ"(Z의 5 배) 여야합니다. iOS 6 이상에서는
( http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns 참조 )
종종 간과되는 문제는 ISO 8601 형식의 문자열에 밀리 초가있을 수 있지만 그렇지 않을 수도 있다는 것입니다.
즉, "2016-12-31T23 : 59 : 59.9999999"와 "2016-12-01T00 : 00 : 00"은 모두 합법적이지만 정적 형식의 날짜 포맷터를 사용하는 경우 그 중 하나가 구문 분석되지 않습니다. .
iOS 10 부터는 ISO8601DateFormatter
ISO 8601 날짜 문자열의 모든 변형을 처리 하는 것을 사용해야 합니다. 아래 예를 참조하십시오.
let date = Date()
var string: String
let formatter = ISO8601DateFormatter()
string = formatter.string(from: date)
let GMT = TimeZone(abbreviation: "GMT")
let options: ISO8601DateFormatOptions = [.withInternetDateTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withTimeZone]
string = ISO8601DateFormatter.string(from: date, timeZone: GMT, formatOptions: options)
들어 아이폰 OS 9 및 아래 여러 데이터 포맷터 다음과 같은 방법을 사용.
나는이 미묘한 차이점을 모두 추상화하고 추상화하는 대답을 찾지 못했습니다. 이를 해결하는 솔루션은 다음과 같습니다.
extension DateFormatter {
static let iso8601DateFormatter: DateFormatter = {
let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX")
let iso8601DateFormatter = DateFormatter()
iso8601DateFormatter.locale = enUSPOSIXLocale
iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
return iso8601DateFormatter
}()
static let iso8601WithoutMillisecondsDateFormatter: DateFormatter = {
let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX")
let iso8601DateFormatter = DateFormatter()
iso8601DateFormatter.locale = enUSPOSIXLocale
iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
return iso8601DateFormatter
}()
static func date(fromISO8601String string: String) -> Date? {
if let dateWithMilliseconds = iso8601DateFormatter.date(from: string) {
return dateWithMilliseconds
}
if let dateWithoutMilliseconds = iso8601WithoutMillisecondsDateFormatter.date(from: string) {
return dateWithoutMilliseconds
}
return nil
}
}
용법:
let dateToString = "2016-12-31T23:59:59.9999999"
let dateTo = DateFormatter.date(fromISO8601String: dateToString)
// dateTo: 2016-12-31 23:59:59 +0000
let dateFromString = "2016-12-01T00:00:00"
let dateFrom = DateFormatter.date(fromISO8601String: dateFromString)
// dateFrom: 2016-12-01 00:00:00 +0000
I also recommend checking Apple article about date formatters.
So use Sam Soffee's category on NSDate found here. With that code added to your project, you can from then on use a single method on NSDate:
- (NSString *)sam_ISO8601String
Not only is it one line, its much faster than the NSDateFormatter approach, since its written in pure C.
From IS8601, the problems are the representation and time zone
- ISO 8601 =
year-month-day time timezone
- For date and time, there are basic (YYYYMMDD, hhmmss, ...) and extended format (YYYY-MM-DD, hh:mm:ss, ...)
- Time zone can be Zulu, offset or GMT
- Separator for date and time can be space, or
T
- There are week format for date, but it is rarely used
- Timezone can be a lot of spaces after
- Second is optional
Here are some valid strings
2016-04-08T10:25:30Z
2016-04-08 11:25:30+0100
2016-04-08 202530GMT+1000
20160408 08:25:30-02:00
2016-04-08 11:25:30 +0100
Solutions
- Parse step by step, like soffes ISO8601
- Convert to basic format, like onmyway133 ISO8601
NSDateFormatter
So here is the format that I'm using in onmyway133 ISO8601
let formatter = NSDateFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.dateFormat = "yyyyMMdd HHmmssZ"
About the Z
identifier Date Field Symbol Table
Z: The ISO8601 basic format with hours, minutes and optional seconds fields. The format is equivalent to RFC 822 zone format (when optional seconds field is absent)
About locale
Formatting Data Using the Locale Settings
Locales represent the formatting choices for a particular user, not the user’s preferred language. These are often the same but can be different. For example, a native English speaker who lives in Germany might select English as the language and Germany as the region
About en_US_POSIX
Technical Q&A QA1480 NSDateFormatter and Internet Dates
On the other hand, if you're working with fixed-format dates, you should first set the locale of the date formatter to something appropriate for your fixed format. In most cases the best locale to choose is "en_US_POSIX", a locale that's specifically designed to yield US English results regardless of both user and system preferences. "en_US_POSIX" is also invariant in time (if the US, at some point in the future, changes the way it formats dates, "en_US" will change to reflect the new behaviour, but "en_US_POSIX" will not), and between machines ("en_US_POSIX" works the same on iOS as it does on OS X, and as it it does on other platforms).
Interesting related quetions
- Converting an ISO 8601 timestamp into an NSDate: How does one deal with the UTC time offset?
- Why NSDateFormatter can not parse date from ISO 8601 format
- Milliseconds NSDateFormatter to parse ISO8601 with and without milliseconds
Just use NSISO8601DateFormatter from Foundation framework.
let isoDateFormatter = ISO8601DateFormatter()
print("ISO8601 string: \(isoDateFormatter.string(from: Date()))")
// ISO8601 string: 2018-03-21T19:11:46Z
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
Based on this gist: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift, the following method can be used to convert NSDate to ISO 8601 date string in the format of yyyy-MM-dd'T'HH:mm:ss.SSSZ
-(NSString *)getISO8601String
{
static NSDateFormatter *formatter = nil;
if (!formatter)
{
formatter = [[NSDateFormatter alloc] init];
[formatter setLocale: [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation: @"UTC"];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"];
}
NSString *iso8601String = [formatter stringFromDate: self];
return [iso8601String stringByAppendingString: @"Z"];
}
This is a little bit simpler and puts the date into UTC.
extension NSDate
{
func iso8601() -> String
{
let dateFormatter = NSDateFormatter()
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let iso8601String = dateFormatter.stringFromDate(NSDate())
return iso8601String
}
}
let date = NSDate().iso8601()
Using Swift 3.0 and iOS 9.0
extension Date {
private static let jsonDateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(identifier: "UTC")!
return formatter
}()
var IOS8601String: String {
get {
return Date.jsonDateFormatter.string(from: self)
}
}
init?(fromIOS8601 dateString: String) {
if let d = Date.jsonDateFormatter.date(from: dateString) {
self.init(timeInterval: 0, since:d)
} else {
return nil
}
}
}
참고URL : https://stackoverflow.com/questions/16254575/how-do-i-get-an-iso-8601-date-on-ios
'Programming' 카테고리의 다른 글
스레드 안전 사전을 구현하는 가장 좋은 방법은 무엇입니까? (0) | 2020.08.06 |
---|---|
경계 상자에 맞게 이미지 크기 조정 (0) | 2020.08.06 |
다음 기능을 표현합니다. 실제로 무엇을위한 것입니까? (0) | 2020.08.06 |
java.sql.SQLException :-ORA-01000 : 최대 열린 커서가 초과되었습니다 (0) | 2020.08.06 |
손가락, 안드로이드로 캔버스에 그리기 (0) | 2020.08.06 |