2017-06-22 62 views
0

我看着槽堆溢出找到答案,我找不到它我想投這個字符串值「1900-01-01T00 :00:00「到日期格式,我試圖用一些像這樣的格式:投下「1900-01-01T00:00:00」字符串值至今

"yyyy-MM-dd HH:mm:ss" 
"EEE, dd MMM yyyy hh:mm:ss +zzzz" 
"YYYY-MM-dd HH:mm:ss.A" 
"yyyy-MM-dd HH:mm:ss.S" 

但其中任何人的工作。 ,我想這樣的

"dd-mm-yyyy" 

的日期格式希望你能幫幫我!

謝謝。

+0

首先,您需要將字符串轉換到一個'Date'所以你需要一個匹配的日期格式。沒有列出的人甚至接近匹配諸如「1900-01-01T00:00:00」之類的字符串。 – rmaddy

+0

「我正在嘗試一些類似的格式」:你可能有更好的機會在抽獎。一個提示?把日期字符串寫在你的格式上,儘量匹配它。例如「」EEE,...「永遠不會匹配它,並閱讀每個字母或其中的幾個意思是什麼意思http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html# Date_Format_Patterns另一個提示:將你的字符串分成多個部分,並試圖找到每個部分的格式。 – Larme

回答

-1

使用我創建的擴展名,您可以在其中傳遞格式作爲參數。

extension String 
{ 
    func toDate(dateFormat format : String) -> Date 
    { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = format 
     if let date = dateFormatter.date(from: self) 
     { 
      return date 
     } 
     print("Invalid arguments ! Returning Current Date . ") 
     return Date() 
    } 
} 
"1900-01-01T00:00:00".toDate(dateFormat: "yyyy-MM-dd'T'HH:mm:ss") //Plyground call test 
+2

你必須引用格式中的'T'。 – rmaddy

+0

你是對的,將編輯答案。 –

+1

這將創建一個DateFormatter對象單次將字符串轉換爲Date –

-1

這是我做的自定義日期格式化:

extension DateFormatter { 

    static let inDateFormatter: DateFormatter = { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
     return dateFormatter 
    }() 

    static let outDateFormatter: DateFormatter = { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "dd-mm-yyyy" 
     return dateFormatter 
    }() 
} 

,然後用它喜歡:

if let date = DateFormatter.inDateFormatter.date(from: "1900-01-01T00:00:00") { 
    let newDateString = DateFormatter.outDateFormatter.string(from: date); 
    print(newDateString) //prints 01-00-1900 
} 

這避免任何潛在的性能問題,顯然在使用點,雖然仍然簡潔。

+1

「dd-mm-yyyy」錯誤MM'是月份'mm'是分鐘 –

+0

這是由OP指定的格式。顯然這很容易定製。 – PeejWeej

+1

你爲什麼要使用日/分/年? –

1

這是一個兩步過程,第一轉換1900-01-01T00:00:00(被稱爲RFC 3999或ISO 8601的日期,稱爲定義該格式的規格)爲Date對象,然後轉換該Date對象回字符串在的01-01-1900形式:

  1. 將字符串轉換在1900-01-01T00:00:00形式爲Date對象,你可以使用ISO8601DateFormatter

    let formatter = ISO8601DateFormatter() 
    formatter.formatOptions.remove(.withTimeZone) 
    
    let date = formatter.date(from: string)! 
    

    這相當於以下DateFormat,其中一個必須手動設置localeen_US_POSIX(因爲RFC 3999/ISO 8601日期使用公曆,無論使用什麼設備的默認日曆類型),並將timeZone到GMT /祖魯語,因爲通常RFC 3999/ISO 8601個日期表示GMT,除非另有規定:

    let formatter = DateFormatter() 
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
    formatter.locale = Locale(identifier: "en_US_POSIX") 
    formatter.timeZone = TimeZone(secondsFromGMT: 0) 
    
    let date = formatter.date(from: string)! 
    

    有關的時區和語言環境的重要性更多信息,解析RFC 3999和ISO 8601的日期,看到蘋果的Technical Q&A 1480

  2. 然後,該Date對象轉換爲一個字符串轉換爲01-01-1900(日,月,年),你會使用的dd-MM-yyyy格式字符串(請注意大寫MM爲「月」,將其從mm區分對於 「分」):

    let formatter2 = DateFormatter() 
    formatter2.dateFormat = "dd-MM-yyyy" 
    
    let string = formatter2.string(from: date) 
    

    兩個關於dateFormat字符串意見:

    • 如果這個字符串顯示到t他可以使用用戶dateStyle而不是dateFormat,例如,:

      formatter2.dateStyle = .short 
      

      雖然這會產生稍微不同的格式,例如dd/MM/yy,這種方法的優點是字符串將被本地化(例如,英國用戶將看到MM/dd/yyyy,他們看到短日期的首選方式)。

      它只是取決於您的dd-MM-yyyy格式的目的。如果是出於內部目的,請繼續使用dateFormat。但如果是在UI中顯示日期,請改用dateStyle,並享受DateFormatter爲您自動執行的本地化。有關更多信息,請參閱DateFormatter reference中的「使用用戶可見的日期和時間表示」部分。

    • 請注意,在沒有爲此第二個格式化程序指定的timeZone時,它會假定ISO 8601日期爲GMT,而您希望在當地時區中查看日期。例如,(1900-01-01T00:00:00 GMT是1899年12月31日下午4點在加利福尼亞州)。如果您想查看原始ISO 8601對象的日期字符串(未針對時區進行更正),則只需將此第二個格式化程序的timeZone設置爲GMT即可。

      formatter2.timeZone = TimeZone(secondsFromGMT: 0) 
      

正如其他人所指出的那樣,要避免不必要的重新實例化DateFormatter對象。所以,你可能會放在這些屬性格式化被實例化一次,或者使用extension

extension DateFormatter { 
    static let customInputFormatter: ISO8601DateFormatter = { 
     let formatter = ISO8601DateFormatter() 
     formatter.formatOptions.remove(.withTimeZone) 
     return formatter 
    }() 

    static let customOutputFormatter: DateFormatter = { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "dd-MM-yyyy" 
     formatter.timeZone = TimeZone(secondsFromGMT: 0) // if you want date in your local timezone, remove this line 
     return formatter 
    }() 
} 

然後:

let input = "1900-01-01T00:00:00" 
let date = DateFormatter.customInputFormatter.date(from: input)! 
let output = DateFormatter.customOutputFormatter.string(from: date) 
print(output) 
相關問題