web-dev-qa-db-ja.com

Swift-iOS-異なる形式の日付と時刻

Swiftで記述されたアプリケーションで働いており、日付と時刻を操作したい

let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .ShortStyle, timeStyle: .ShortStyle)

戻り値

2/12/15, 11:27 PM

たとえば、dd/mm/yyなどのヨーロッパ形式の日付と、24時間形式のAMとPMさまざまな要素を並べ替えるには、N個の文字列を使用する必要がありますか?

41
GioB
func convertDateFormater(date: String) -> String {   
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    dateFormatter.timeZone = NSTimeZone(name: "UTC")

    guard let date = dateFormatter.dateFromString(date) else {
        assert(false, "no date from string")
        return ""
    }

    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let timeStamp = dateFormatter.stringFromDate(date)

    return timeStamp
}

Swift 4の編集

func convertDateFormatter(date: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    dateFormatter.locale = Locale(identifier: "your_loc_id")
    let convertedDate = dateFormatter.date(from: date)

    guard dateFormatter.date(from: date) != nil else {
        assert(false, "no date from string")
        return ""
    } 

    dateFormatter.dateFormat = "yyyy MMM HH:mm EEEE"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let timeStamp = dateFormatter.string(from: convertedDate!)

    return timeStamp
}
59
idris yıldız

すでに述べたように、DateFormatterを使用してDateオブジェクトをフォーマットする必要があります。これを行う最も簡単な方法は、読み取り専用の計算プロパティの日付拡張を作成することです。


読み取り専用の計算済みプロパティ

ゲッターはあるがセッターがない計算プロパティは、読み取り専用の計算プロパティと呼ばれます。読み取り専用の計算プロパティは常に値を返し、ドット構文を介してアクセスできますが、別の値に設定することはできません。

注:

読み取り専用の計算済みプロパティを含む計算済みプロパティは、値が固定されていないため、varキーワードを使用して変数プロパティとして宣言する必要があります。 letキーワードは定数プロパティにのみ使用され、インスタンスの初期化の一部として一度設定されると、その値を変更できないことを示します。

Getキーワードとその中括弧を削除することで、読み取り専用の計算プロパティの宣言を簡略化できます。


extension Formatter {
    static let date = DateFormatter()
}

extension Date {
    var europeanFormattedEn_US : String {
        Formatter.date.calendar = Calendar(identifier: .iso8601)
        Formatter.date.locale   = Locale(identifier: "en_US_POSIX")
        Formatter.date.timeZone = .current
        Formatter.date.dateFormat = "dd/M/yyyy, H:mm"
        return Formatter.date.string(from: self)
    }
}

それを元に戻すには、別の読み取り専用の計算プロパティを作成できますが、文字列拡張として使用できます。

 extension String {
    var date: Date? {
        return Formatter.date.date(from: self)
    }
    func dateFormatted(with dateFormat: String = "dd/M/yyyy, H:mm", calendar: Calendar = Calendar(identifier: .iso8601), defaultDate: Date? = nil, locale: Locale = Locale(identifier: "en_US_POSIX"), timeZone: TimeZone = .current) -> Date? {
        Formatter.date.calendar = calendar
        Formatter.date.defaultDate = defaultDate ?? calendar.date(bySettingHour: 12, minute: 0, second: 0, of: Date())
        Formatter.date.locale = locale
        Formatter.date.timeZone = timeZone
        Formatter.date.dateFormat = dateFormat
        return Formatter.date.date(from: self)
    }
}

使用法:

let dateFormatted = Date().europeanFormattedEn_US         //"29/9/2018, 16:16"
if let date = dateFormatted.date {
    print(date.description(with:.current)) // Saturday, September 29, 2018 at 4:16:00 PM Brasilia Standard Time\n"\
    date.europeanFormattedEn_US                         // "29/9/2018, 16:27"
}

let dateString = "14/7/2016"
if let date = dateString.toDateFormatted(with: "dd/M/yyyy") {
    print(date.description(with: .current))
 // Thursday, July 14, 2016 at 12:00:00 PM Brasilia Standard Time\n"
}
30
Leo Dabus

Zaphが述べたように、ドキュメントに従う必要があります。確かに、他のクラス参照と比較すると、それは最も簡単ではないかもしれません。簡単に言うと、 日付フィールドシンボルテーブル を使用して、必要な形式を特定します。一度したら:

let dateFormatter = NSDateFormatter()
//the "M/d/yy, H:mm" is put together from the Symbol Table
dateFormatter.dateFormat = "M/d/yy, H:mm"
dateFormatter.stringFromDate(NSDate())

文字列である日付をNSDateに変換する必要がある場合は、テーブルを使用できる必要もあります。

let dateAsString = "02/12/15, 16:48"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "M/d/yyyy, H:mm"
let date = dateFormatter.dateFromString(dateAsString)
12
Jeremy Pope

現在の日時からフォーマットされた文字列:

let currentDate = Date()
let dateFormatter = DateFormatter()

dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss a"
let convertedDate: String = dateFormatter.string(from: currentDate) //08/10/2016 01:42:22 AM

その他の日時形式

10
Atif Mahmood

NSDateFormatterはすでに見つかりました。ドキュメントを読んでください。

NSDateFormatterクラスリファレンス

フォーマット文字定義用
以下を参照してください ICU Formatting Dates and Times
また: Date Field SymbolTable。

4
zaph

プロトコル指向プログラミング(Swift 3)を使用する場合

1)Dateableプロトコルを作成します

protocol Dateable {
    func userFriendlyFullDate() -> String
    func userFriendlyHours() -> String
}

2)Dateクラスを拡張し、Dateableプロトコルを実装する

extension Date: Dateable {
    var  formatter: DateFormatter { return DateFormatter() }

    /** Return a user friendly hour */
    func userFriendlyFullDate() -> String {
        // Customize a date formatter
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        formatter.timeZone = TimeZone(abbreviation: "UTC")

        return formatter.string(from: self)
    }

    /** Return a user friendly hour */
    func userFriendlyHours() -> String {
        // Customize a date formatter
        formatter.dateFormat = "HH:mm"
        formatter.timeZone = TimeZone(abbreviation: "UTC")

        return formatter.string(from: self)
    }

    // You can add many cases you need like string to date formatter

}

)使用する

let currentDate: Date = Date()
let stringDate: String = currentDate.userFriendlyHours()
// Print 15:16
4
Ludovic

私は@ iod07と同様のアプローチを使用しましたが、拡張として使用しました。また、それがどのように機能するかを理解するために、コメントにいくつかの説明を追加しました。

基本的には、これをビューコントローラーの上部または下部に追加するだけです。

extension NSString {

class func convertFormatOfDate(date: String, originalFormat: String, destinationFormat: String) -> String! {

    // Orginal format :
    let dateOriginalFormat = NSDateFormatter()
    dateOriginalFormat.dateFormat = originalFormat      // in the example it'll take "yy MM dd" (from our call)

    // Destination format :
    let dateDestinationFormat = NSDateFormatter()
    dateDestinationFormat.dateFormat = destinationFormat // in the example it'll take "EEEE dd MMMM yyyy" (from our call)

    // Convert current String Date to NSDate
    let dateFromString = dateOriginalFormat.dateFromString(date)

    // Convert new NSDate created above to String with the good format
    let dateFormated = dateDestinationFormat.stringFromDate(dateFromString!)

    return dateFormated

}
}

変換したいとしましょう"16 05 05"から"Thursday 05 May 2016"および日付は次のように宣言されていますlet date = "16 06 05"

次に、次のように呼び出すだけです。

let newDate = NSString.convertFormatOfDate(date, originalFormat: "yy MM dd", destinationFormat: "EEEE dd MMMM yyyy")

それが役に立てば幸い !

3
tsnkff

スウィフト3:

//This gives month as three letters (Jun, Dec, etc)
let justMonth = DateFormatter()
justMonth.dateFormat = "MMM"
myFirstLabel.text = justMonth.string(from: myDate)

//This gives the day of month, with no preceding 0s (6,14,29)
let justDay = DateFormatter()
justDay.dateFormat = "d"
mySecondLabel.text = justDay.string(from: myDate)

//This gives year as two digits, preceded by an apostrophe ('09, '16, etc)
let justYear = DateFormatter()
justYear.dateFormat = "yy"
myThirdLabel.text = "'\(justYear.string(from: lastCompDate))"

より多くのフォーマットについては、利用可能なすべてのフォーマットを含むこの link をcodingExplorerテーブルにチェックしてください。各日付コンポーネントにはいくつかのオプションがあります。次に例を示します。

年:

  • 「y」-2016(1年目のような初期の日付は「1」になります)
  • "yy"-16(1年目: "01"
  • "yyy"-2016(1年目: "001")
  • "yyyy"-2016(1年目: "0001")

ほとんどすべてのコンポーネントには2〜4のオプションがあり、最初の文字を使用して形式を表現します(日は「d」、時間は「h」など)。ただし、小文字の "m"は分のために予約されているため、月は大文字の "M"です。ただし、他にも例外があるため、リンクを確認してください。

2
Dave G

Xcode 10.1(2019年2月23日)で動作するソリューションは次のとおりです。

func getCurrentDateTime() {

    let now = Date()
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "fr_FR")
    formatter.dateFormat = "EEEE dd MMMM YYYY"
    labelDate.text = formatter.string(from: now)
    labelDate.font = UIFont(name: "HelveticaNeue-Bold", size: 12)
    labelDate.textColor = UIColor.lightGray

    let text = formatter.string(from: now)
    labelDate.text = text.uppercased()
}

「Accueil」ラベルはコードに接続されていません。

2
Benjamin Tourin

iOS 8以降

locale explicitlyを指定するのは面倒で難しいです。アプリがどこで使用されるかはわかりません。したがって、localeCalender.current.localeに設定し、DateFormattersetLocalizedDateFormatFromTemplateメソッドを使用することをお勧めします。

setLocalizedDateFormatFromTemplate(_ :)

レシーバーの指定されたロケールを使用して、テンプレートから日付形式を設定します。 - developer.Apple.com

extension Date {
    func convertToLocaleDate(template: String) -> String {
        let dateFormatter = DateFormatter()

        let calender = Calendar.current

        dateFormatter.timeZone = calender.timeZone
        dateFormatter.locale = calender.locale
        dateFormatter.setLocalizedDateFormatFromTemplate(template)

        return dateFormatter.string(from: self)
    }
}



Date().convertToLocaleDate(template: "dd MMMM YYYY")
0
mahan
let usDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "en-US"))
            //usDateFormat now contains an optional string "MM/dd/yyyy"

let gbDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "en-GB"))
            //gbDateFormat now contains an optional string "dd/MM/yyyy"

let geDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "de-DE"))
            //geDateFormat now contains an optional string "dd.MM.yyyy"

次のように使用して、デバイスから現在の形式を取得できます。

let currentDateFormat = DateFormatter.dateFormat(fromTemplate: "MMddyyyy", options: 0, locale: Locale.current)
0
mswyss
extension String {

    func convertDatetring_TopreferredFormat(currentFormat: String, toFormat : String) ->  String {
        let dateFormator = DateFormatter()
        dateFormator.dateFormat = currentFormat
        let resultDate = dateFormator.date(from: self)
        dateFormator.dateFormat = toFormat
        return dateFormator.string(from: resultDate!)
    }

}

以下のように、ビューコントローラファイルから呼び出します。

"your_date_string".convertDatetring_TopreferredFormat(currentFormat: "yyyy-MM-dd HH:mm:ss.s", toFormat: "dd-MMM-yyyy h:mm a")
0
Sunil aruru
let dateString = "1970-01-01T13:30:00.000Z"
let formatter = DateFormatter()

formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let date = formatter.date(from: String(dateString.dropLast(5)))!
formatter.dateFormat = "hh.mma"
print(formatter.string(from: date))

私が.dateFormat = "hh.mma"byこれにより、時間のみが取得されます。結果:01.30PM

0
Ahsan

これはおそらく古いスレッドですが、私は最近日時に取り組んでいて、同様の問題に悩まされていたため、次のような私のユーティリティを作成しました。

このユーティリティは文字列の日付を取り、オプションの日付オブジェクトを返します

_        func toDate(dateFormat: DateFormatType) -> Date? {
        let formatter = DateFormatter()
        formatter.timeZone = NSTimeZone(name: "UTC") as TimeZone?
        formatter.dateFormat = dateFormat.rawValue
        let temp = formatter.date(from: self)
        return formatter.date(from: self)
        }
_

DateFormatType enumは次のようになります

_        enum DateFormatType : String {
        case type1 = "yyyy-MM-dd - HH:mm:ss"
        case type2 = "dd/MM/yyyy"
        case type3 = "yyyy/MM/dd"
    }
_

ここで述べておきたい重要なことは、

formatter.timeZone = NSTimeZone(name: "UTC") as TimeZone?

この行を追加することは非常に重要です。これがないと、DateFormatterはデフォルトの変換を使用して日付を変換し、リモートチームで作業しているときにさまざまな問題が発生すると、異なる日付が表示される可能性があります。日付に応じたデータ。

お役に立てれば

0
NSDumb