日付を文字列に変換する


日付を使用して迅速なコードで表されますDate 構造
The Date タイプは、日付で働くことを簡単にします.持続性のような操作を簡単に行うことができますDate インスタンス、2つの日付を比較するDate 週末などに該当する.
一方Date タイプはコードの日付で働くために大きいです、彼らはしばしばそれらに対応するように変換される必要がありますString ユーザーの前に表示されます.
int、float、etcなどの文字列表現への変換は簡単ですただし、変換Date インスタンスString 表現は些細な仕事ではない.
異なる地理的な領域で使用される異なる日付書式を説明し、ローカライズを処理し、日付を使用するコンテキストを考慮する必要があります.
方法Date どのように頻繁に我々はそれを操作する必要があります、それを分離する賢明ですDate 取扱いコード.
この記事では、日付を文字列に変換する方法を見ます.一般に、DateFormatterクラスを使用して処理日のすべてのニュアンスを抽象化する方法を見ています.
また、今日のように文字列を変換する方法を参照してください.

日付を文字列に変換
最初にdateインスタンスを作成し、文字列に変換します.

let today = Date() 
// 2020-08-22 10:50:48 +0000

let strDate = "\(today)"
// 2020-08-22 10:53:05 +0000

生成された日付文字列はすべての情報を持っていますが、それは読むのが簡単でありません、そして、それはあなたがユーザーに表示する何かでありません.
この方法を改善する方法を見てみましょう.

DateFormatterの導入
The DateFormatter クラス変換Date 対応する物String 表現とバック
コードを変換するために必要な3ステップを示しますDateString 迅速に.

// Convert string to Date
let dateF = DateFormatter()  // 1

dateF.dateStyle = .short     // 2 

dateF.string(from: today)    // 3 
// "8/23/20"

  • クリエイトアDateFormatter インスタンス.
  • DataStyleを選択します.ここで我々は.ショートスタイル.
  • 呼び出しstring(from:) メソッドDateFormatter インスタンス.
  • 我々が選ぶことができる他のdatestylesは、そうです.ミディアム.ロング.フル、そして.なし.
    
    dateF.dateStyle = .medium
    dateF.string(from: today)
    // "Aug 23, 2020"
    
    dateF.dateStyle = .long
    dateF.string(from: today)
    // "August 23, 2020"
    
    dateF.dateStyle = .full
    dateF.string(from: today)
    // "Sunday, August 23, 2020"
    
    

    日付を「自然」文字列に変換します
    異なるDateStyleプロパティはほとんどの場合よく動作しますが、正式な傾向があります.いくつかの状況では、“自然な”または人間に優しい文字列表現が欲しいかもしれません.私たちは日常会話で使用する言葉.
    EGの場合は、次の日あなたの友人に会う予定です.「2020年8月24日に会いましょう」というよりも「明日会えます」と言うかもしれません
    DateFormatterは再び救助に来ます.プロパティを設定できますdoesRelativeDateFormatting = true ヴィオラ.
    
    dateF.doesRelativeDateFormatting = true
    
    dateF.string(from: today)
    // "Today" 
    
    let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)!
    dateF.string(from: tomorrow)  
    // "Tomorrow" 
    
    let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)!
    dateF.string(from: yesterday)  
    // "Yesterday" 
    
    

    日付形式へのロケールの効果
    これまでのところ、コードサンプルは英語で文字列を返しました.なぜなら、私のmacの現在のロケールがen_US
    あなたのロケールに基づいて結果が異なる可能性があります.現在のロケールを検査することで確認できますLocale.current プロパティ.
    日付は、世界のさまざまな部分で異なる方法で表されます.言うまでもなく、同じ地域の中でさえ、日付形式は日付が使われる文脈に基づいて変化します.
    ウィキペディアのこの抜粋は、ロケールと日付がどう関連するかを要約します.

    The legal and cultural expectations for date and time representation vary between countries, and it is important to be aware of the forms of all-numeric calendar dates used in a particular country to know what date is intended.
    Wikipedia


    例えば、日付01/10/20は米国で2020年1月10日と解釈されます、しかし、インドの同じ日付は2020年10月01日です.
    これがどれくらい複雑になるかについての感覚を得るために、このWikipediaページを見てください.https://en.wikipedia.org/wiki/Date_format_by_country
    解決策DateFormatter再び.現在、DateFormatterはほぼ900 +のロケールをサポートしています.
    サポートされているロケール印刷の完全なリストのためにLocale.availableIdentifiers プロパティ.
    DateFormatterは、ユーザーの現在のロケールを自動的に取得し、出力を適切にフォーマットします.
    ほとんどの場合、デフォルトの動作はユーザが期待しているものであり、変更されるべきではない.
    DataFormatterのロケールを変更する場合は、次のようにロケールを設定できます.
    
    dateF.locale = Locale(identifier: "de")
    dateF.string(from: today)
    
    dateF.locale = Locale(identifier: "fr")
    dateF.string(from: Date())
    
    dateF.locale = Locale(identifier: "ja_JP")
    dateF.string(from: Date())
    
    
    表:ロケールに基づく日付文字列変換
    エンカウアス
    ヒゲイン
    デカンド
    今日- 2日
    --
    परसों
    渦堤
    今日- 1日目
    昨日
    कल
    船尾
    今日
    今日
    आज
    シュート
    今日は1日目
    明日
    आने वाला कल
    モーゲン
    今日は2日
    --
    आने वाला परसों
    発動する
    このポストでは、我々は一見単純なタスク-どのように文字列に日付を変換-すぐに複雑になることを見た.
    文字列変換への日付は、領域、言語、コンテキストなどに依存します.
    書式設定日付に関連するすべての複雑さを考えると、DateFormatterがすべての重いリフティングを行うのがベストです.
    それはあなたが拒否することはできませんし、拒否を提供しています.

    参考文献
    アップル開発者向けドキュメントDate
    アップル開発者向けドキュメントDateFormatter
    Unicode Common Locale Data Repository