আইএসও 8601, আরএফসি 3339, ইউটিসির সময় অঞ্চল হিসাবে একটি তারিখের স্ট্যাম্প এবং ফর্ম্যাট কীভাবে তৈরি করবেন?


186

আইএসও 8601 এবং আরএফসি 3339 এর ফর্ম্যাট মান ব্যবহার করে কীভাবে একটি তারিখের স্ট্যাম্প তৈরি করা যায় ?

লক্ষ্যটি এমন একটি স্ট্রিং যা দেখে মনে হয়:

"2015-01-01T00:00:00.000Z"

বিন্যাস:

  • বছর, মাস, দিন, "XXXX-XX-XX" হিসাবে
  • বিভাজক হিসাবে "টি" বর্ণটি
  • ঘন্টা, মিনিট, সেকেন্ড, মিলিসেকেন্ড, "XX: XX: XX.XXX" হিসাবে।
  • জিরো অফসেট, ওরফে ইউটিসি, জিএমটি, জুলু সময়ের জন্য জোন ডিজাইনার হিসাবে চিঠি "জেড"

সর্বোত্তম ঘটনা:

  • সহজ, সংক্ষিপ্ত এবং সোজা সোফাইট সোর্স কোড।
  • কোনও অতিরিক্ত কাঠামো, সাবপ্রজেক্ট, কোকোপড, সি কোড ইত্যাদি ব্যবহার করার দরকার নেই

আমি স্ট্যাকওভারফ্লো, গুগল, অ্যাপল ইত্যাদি অনুসন্ধান করেছি এবং এর কোনও সুইফ উত্তর খুঁজে পাইনি।

ক্লাস প্রতিশ্রুতিময় মনে হয় NSDate, NSDateFormatter, NSTimeZone

সম্পর্কিত প্রশ্নোত্তর: আমি আইওএসে আইএসও 8601 তারিখটি কীভাবে পাব?

আমি এখন পর্যন্ত যে সেরাটি নিয়ে এসেছি তা এখানে:

var now = NSDate()
var formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
println(formatter.stringFromDate(now))

5
মনে রাখবেন যে আইওএস 10 + সিম্পলাই আইএসও 8601 বিল্ট-ইন অন্তর্ভুক্ত করে .. এটি কেবল আপনার জন্য স্বয়ংক্রিয়ভাবে সম্পূর্ণ হবে।
ফ্যাটি

2
@ ফ্যাটি এবং - কীভাবে এটি শেষের 2323 জেড মিলিসেকেন্ড জুলু / ইউটিসি টাইমস্ট্যাম্পের অংশটি পরিচালনা করতে পারে? উত্তরঃ ম্যাট Longs হয়তো @ stackoverflow.com/a/42101630/3078330
smat88dd

1
@ smat88dd - দুর্দান্ত টিপ, ধন্যবাদ অদ্ভুত এবং বন্য!
ফ্যাটি

আমি এমন একটি সমাধান খুঁজছি যা লিনাক্সে কাজ করে।
নিউনি

@neoneye শুধু পুরোনো সংস্করণ (সাধারণ DateFormatter) ব্যবহার এবং গ্রেগরিয়ান ক্যালেন্ডার iso8601 পরিবর্তন stackoverflow.com/a/28016692/2303865
লিও Dabus

উত্তর:


392

সুইফ্ট 4 • আইওএস 11.2.1 বা তারপরে

extension ISO8601DateFormatter {
    convenience init(_ formatOptions: Options, timeZone: TimeZone = TimeZone(secondsFromGMT: 0)!) {
        self.init()
        self.formatOptions = formatOptions
        self.timeZone = timeZone
    }
}

extension Formatter {
    static let iso8601withFractionalSeconds = ISO8601DateFormatter([.withInternetDateTime, .withFractionalSeconds])
}

extension Date {
    var iso8601withFractionalSeconds: String { return Formatter.iso8601withFractionalSeconds.string(from: self) }
}

extension String {
    var iso8601withFractionalSeconds: Date? { return Formatter.iso8601withFractionalSeconds.date(from: self) }
}

ব্যবহার:

Date().description(with: .current)  //  Tuesday, February 5, 2019 at 10:35:01 PM Brasilia Summer Time"
let dateString = Date().iso8601withFractionalSeconds   //  "2019-02-06T00:35:01.746Z"

if let date = dateString.iso8601withFractionalSeconds {
    date.description(with: .current) // "Tuesday, February 5, 2019 at 10:35:01 PM Brasilia Summer Time"
    print(date.iso8601withFractionalSeconds)           //  "2019-02-06T00:35:01.746Z\n"
}

iOS 9 9 3 বা তারপরে সুইফট

extension Formatter {
    static let iso8601withFractionalSeconds: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
        return formatter
    }()
}

কোডেবল প্রোটোকল

কোডেবল প্রোটোকলের সাথে কাজ করার সময় যদি আপনাকে এই ফর্ম্যাটটি এনকোড এবং ডিকোড করতে হয় তবে আপনি নিজের কাস্টম ডেট এনকোডিং / ডিকোডিং কৌশল তৈরি করতে পারেন:

extension JSONDecoder.DateDecodingStrategy {
    static let iso8601withFractionalSeconds = custom {
        let container = try $0.singleValueContainer()
        let string = try container.decode(String.self)
        guard let date = Formatter.iso8601withFractionalSeconds.date(from: string) else {
            throw DecodingError.dataCorruptedError(in: container,
                  debugDescription: "Invalid date: " + string)
        }
        return date
    }
}

এবং এনকোডিং কৌশল

extension JSONEncoder.DateEncodingStrategy {
    static let iso8601withFractionalSeconds = custom {
        var container = $1.singleValueContainer()
        try container.encode(Formatter.iso8601withFractionalSeconds.string(from: $0))
    }
}

খেলার মাঠ পরীক্ষা

let dates = [Date()]   // ["Feb 8, 2019 at 9:48 PM"]

এনকোডিং

let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601withFractionalSeconds
let data = try! encoder.encode(dates)
print(String(data: data, encoding: .utf8)!)

পাঠোদ্ধারতা

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601withFractionalSeconds
let decodedDates = try! decoder.decode([Date].self, from: data)  // ["Feb 8, 2019 at 9:48 PM"]

এখানে চিত্র বর্ণনা লিখুন


3
এটা তোলে বিপরীত রূপান্তর এক্সটেনশন যোগ করার জন্য দরকারী হতে চাই:extension String { var dateFormattedISO8601: NSDate? {return NSDate.Date.formatterISO8601.dateFromString(self)} }
লাইভ

1
কেবলমাত্র একটি নোট যে এটি কিছুটা নির্ভুলতা হারিয়ে ফেলেছে তাই নিশ্চিত করা গুরুত্বপূর্ণ যে খেজুরের সমতাটি উত্পন্ন স্ট্রিংয়ের মাধ্যমে সময়সাথে নয়, সময়ের সাথে তুলনা করা হয়। let now = NSDate() let stringFromDate = now.iso8601 let dateFromString = stringFromDate.dateFromISO8601! XCTAssertEqual(now.timeIntervalSince1970, dateFromString.timeIntervalSince1970)
পিক্সেলভিশন

7
বলা বাহুল্য, আপনার যদি মিলিসেকেন্ডগুলির প্রয়োজন না হয় তবে নতুন আইওএস 10 ISO8601DateFormatterপ্রক্রিয়াটি সহজ করে দেয়। আমি অ্যাপলকে একটি বাগ রিপোর্ট (27242248) জারি করেছি, তাদের অনুরোধ করে এই নতুন ফর্ম্যাটটিকে প্রসারিত করার জন্য মিলিসেকেন্ডগুলি সুনির্দিষ্ট করার জন্যও (যেমন এই নতুন ফর্ম্যাটরটি আমাদের অনেকের জন্য মিলিসেকেন্ড ব্যতীত ব্যবহারযোগ্য নয়)।
রব

1
ইন RFC3339 আমরা একটি নোট জানতে পারেন (বলুন) টি "এই সিনট্যাক্স ব্যবহার অ্যাপ্লিকেশন পাঠযোগ্যতা অনুরোধে জন্য চয়ন করতে পারেন, একটি পূর্ণ-ডেট এবং ফুল টাইম দ্বারা পৃথক নির্দিষ্ট করার:" আইএসও 8601 সংজ্ঞায়িত তারিখ এবং সময় দ্বারা পৃথক নোট "। একটি স্থান অক্ষর। " এটি Tউদাহরণস্বরূপ ছাড়াও তারিখের বিন্যাসটি কভার করে 2016-09-21 21:05:10+00:00?
manRo

3
@ লিওডাবাস হ্যাঁ, তবে এটি "সুইফট আইসো 8601" এর প্রথম ফলাফল। আমার মন্তব্যটি অন্য বিকাশকারীদের যারা ভবিষ্যতে এটিকে জুড়ে দিয়েছিল এবং তাদেরকে ওপিতে পরিচালিত হয়নি তাদের সতর্ক করার উদ্দেশ্যে ছিল।
thislooksfun

38

প্রযুক্তিগত প্রশ্নোত্তর ও A1480 তেen_US_POSIX বর্ণিত হিসাবে লোকেলটি সেট করতে মনে রাখবেন । সুইফ্ট 3 এ:

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

সমস্যাটি হল এই যে আপনি একটি ডিভাইস যা অ গ্রেগরিয়ান ক্যালেন্ডার ব্যবহার করা হয় ব্যস্ত রয়েছেন কিনা বছর যদি না আপনি উল্লেখ RFC3339 / ISO8601 সাথে সামঞ্জস্য না হবে localeএবং সেইসাথে timeZoneএবং dateFormatস্ট্রিং।

অথবা আপনি ব্যবহার করতে পারেন ISO8601DateFormatterআপনি সেটিং আগাছা নামা localeএবং timeZoneনিজেকে:

let date = Date()
let formatter = ISO8601DateFormatter()
formatter.formatOptions.insert(.withFractionalSeconds)  // this is only available effective iOS 11 and macOS 10.13
print(formatter.string(from: date))

সুইফট 2 রেন্ডিশনের জন্য, এই উত্তরের পূর্ববর্তী সংশোধনটি দেখুন ।


আমাদের কেন লোকেলটি en_US_POSIX এ সেট করা উচিত? আমরা মার্কিন যুক্তরাষ্ট্রে না থাকলেও?
mnemonic23

2
ভাল, আপনার কিছু সামঞ্জস্যপূর্ণ লোকেল প্রয়োজন এবং আইএসও 8601 / আরএফসি 3999 স্ট্যান্ডার্ডগুলির কনভেনশনটি সেই ফর্ম্যাটটি সরবরাহ করে en_US_POSIX। ওয়েবে তারিখ বিনিময় করার জন্য এটি লিঙ্গুয়া ফ্র্যাঙ্কা । তারিখের স্ট্রিং সংরক্ষণের সময় ডিভাইসে একটি ক্যালেন্ডার ব্যবহার করা হত এবং পরে যখন স্ট্রিংটি আবার পড়তে হয় তবে তারিখগুলি ভুল ব্যাখ্যা করতে পারে না। এছাড়াও, আপনার এমন একটি ফর্ম্যাট দরকার যা গ্যারান্টিযুক্ত যা কখনই পরিবর্তিত হবে না (যার কারণে আপনি ব্যবহার করেন en_US_POSIXএবং না en_US)। আরও তথ্যের জন্য প্রযুক্তিগত প্রশ্নোত্তর 1480 বা সেগুলি আরএফসি / আইএসও মান দেখুন।
রব

24

আপনি যদি ISO8601DateFormatter()একটি রেলস 4+ জেএসওন ফিডের তারিখ সহ ব্যবহার করতে চান (এবং অবশ্যই মিলিসের প্রয়োজন নেই), সঠিকভাবে কাজ করার জন্য আপনাকে ফর্ম্যাটরে কয়েকটি বিকল্প সেট করতে হবে অন্যথায় date(from: string)ফাংশনটি শূন্য হয়ে যাবে। আমি যা ব্যবহার করছি তা এখানে:

extension Date {
    init(dateString:String) {
        self = Date.iso8601Formatter.date(from: dateString)!
    }

    static let iso8601Formatter: ISO8601DateFormatter = {
        let formatter = ISO8601DateFormatter()
        formatter.formatOptions = [.withFullDate,
                                          .withTime,
                                          .withDashSeparatorInDate,
                                          .withColonSeparatorInTime]
        return formatter
    }()
}

কোনও খেলার মাঠের স্ক্রিনশটে নয় বিকল্পগুলির শ্লোকগুলি ব্যবহারের ফলাফল এখানে:

এখানে চিত্র বর্ণনা লিখুন


আপনাকে বিকল্পগুলির মধ্যে অন্তর্ভুক্ত করতে হবে .withFractionalSecondsতবে আমি ইতিমধ্যে এটি চেষ্টা করেছি এবং এটি একটি ত্রুটি ছুঁড়ে রাখে libc++abi.dylib: terminating with uncaught exception of type NSException
লিও ডাবিস 12:37

@ মেমনাবাঃ সুইফট ৪-এ এটি আমার পক্ষে ভাল কাজ করে? আপনি কি ত্রুটি পাচ্ছেন?
ম্যাট লং

@ লিওডাবাস, আপনার মতো একই ত্রুটি পেয়েছে, আপনি কি এটি সমাধান করেছেন?
ফ্রিম্যান

কাস্টম JSONDecoder DateDecodingStrategy stackoverflow.com/a/46458771/2303865
লিও Dabus

@ ফ্রিম্যান আপনি যদি তার সমস্ত ভগ্নাংশের সেকেন্ড সহ তারিখটি সংরক্ষণ করতে চান তবে সার্ভারে আপনার তারিখটি সংরক্ষণ / গ্রহণ করার সময় আমি একটি দ্বিগুণ (রেফারেন্সের তারিখের পরে সময় ব্যবধান) ব্যবহার করার পরামর্শ দিই। .deferredToDateকোডিং প্রোটোকল ব্যবহার করার সময় এবং ডিফল্ট তারিখের ডিকোডিং কৌশলটি ব্যবহার করুন
লিও ডাবাস

6

সুইফট 5

আপনি iOS 11.0+ / MacOS 10.13+ লক্ষ্য করে থাকেন, তবে আপনি কেবল ব্যবহার ISO8601DateFormatterসঙ্গে withInternetDateTimeএবং withFractionalSecondsবিকল্প, যেমন:

let date = Date()

let iso8601DateFormatter = ISO8601DateFormatter()
iso8601DateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let string = iso8601DateFormatter.string(from: date)

// string looks like "2020-03-04T21:39:02.112Z"

5

অ্যান্ড্রেস টরেস ম্যারোকোয়ান এবং লিও ডাবাসকে আরও প্রশংসা করতে আমার একটি সংস্করণ রয়েছে যা ভগ্নাংশের সেকেন্ড সংরক্ষণ করে। আমি এটি অন্য কোথাও নথিভুক্ত দেখতে পাচ্ছি না, তবে অ্যাপলটি মাইক্রোসেকেন্ডে (সংক্ষিপ্ততার 3 ডিজিট) উভয় ইনপুট এবং আউটপুটে (যদিও ইউনিকোড ট্র3531 এর বিপরীতে এসএসএসএসএসএস ব্যবহার করে নির্দিষ্ট করা হয়েছে ) কে ছেঁচে

আমার জোর দেওয়া উচিত যে বেশিরভাগ ব্যবহারের ক্ষেত্রে এটি সম্ভবত প্রয়োজনীয় নয় । অনলাইনে তারিখগুলি সাধারণত মিলিসেকেন্ডের নির্ভুলতার প্রয়োজন হয় না এবং যখন তারা করেন, প্রায়শই একটি পৃথক ডেটা ফর্ম্যাট ব্যবহার করা ভাল। তবে কখনও কখনও একটি নির্দিষ্ট উপায়ে একটি পূর্ব-বিদ্যমান সিস্টেমের সাথে আন্তঃসংযোগ করতে হবে।

এক্সকোড 8/9 এবং সুইফট 3.0.3.2

extension Date {
    struct Formatter {
        static let iso8601: DateFormatter = {
            let formatter = DateFormatter()
            formatter.calendar = Calendar(identifier: .iso8601)
            formatter.locale = Locale(identifier: "en_US_POSIX")
            formatter.timeZone = TimeZone(identifier: "UTC")
            formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXXXX"
            return formatter
        }()
    }

    var iso8601: String {
        // create base Date format 
         var formatted = DateFormatter.iso8601.string(from: self)

        // Apple returns millisecond precision. find the range of the decimal portion
         if let fractionStart = formatted.range(of: "."),
             let fractionEnd = formatted.index(fractionStart.lowerBound, offsetBy: 7, limitedBy: formatted.endIndex) {
             let fractionRange = fractionStart.lowerBound..<fractionEnd
            // replace the decimal range with our own 6 digit fraction output
             let microseconds = self.timeIntervalSince1970 - floor(self.timeIntervalSince1970)
             var microsecondsStr = String(format: "%.06f", microseconds)
             microsecondsStr.remove(at: microsecondsStr.startIndex)
             formatted.replaceSubrange(fractionRange, with: microsecondsStr)
        }
         return formatted
    }
}

extension String {
    var dateFromISO8601: Date? {
        guard let parsedDate = Date.Formatter.iso8601.date(from: self) else {
            return nil
        }

        var preliminaryDate = Date(timeIntervalSinceReferenceDate: floor(parsedDate.timeIntervalSinceReferenceDate))

        if let fractionStart = self.range(of: "."),
            let fractionEnd = self.index(fractionStart.lowerBound, offsetBy: 7, limitedBy: self.endIndex) {
            let fractionRange = fractionStart.lowerBound..<fractionEnd
            let fractionStr = self.substring(with: fractionRange)

            if var fraction = Double(fractionStr) {
                fraction = Double(floor(1000000*fraction)/1000000)
                preliminaryDate.addTimeInterval(fraction)
            }
        }
        return preliminaryDate
    }
}

আমার মতে এটি সর্বোত্তম উত্তর যে এটির সাহায্যে একটি মাইক্রোসেকেন্ড স্তরে পৌঁছতে দেয় যেখানে অন্যান্য সমস্ত সমাধান মিলিসেকেন্ডে কাটা যায়।
মাইকেল এ। ম্যাকক্লোস্কি

আপনি যদি তার সমস্ত ভগ্নাংশের সেকেন্ডের সাথে তারিখটি সংরক্ষণ করতে চান তবে সার্ভারে আপনার তারিখটি সংরক্ষণ / গ্রহণ করার সময় আপনার কেবলমাত্র একটি দ্বিগুণ (রেফারেন্সের তারিখের পরে সময় ব্যবধান) ব্যবহার করা উচিত।
লিও ডাবাস

@ লিওডাবাস হ্যাঁ, আপনি যদি পুরো সিস্টেমটি নিয়ন্ত্রণ করেন এবং আন্তঃব্যক্তির প্রয়োজন না হয়। আমি উত্তরে যেমন বলেছি, বেশিরভাগ ব্যবহারকারীর জন্য এটি প্রয়োজনীয় নয়। তবে ওয়েব আইপিআইগুলিতে ডেটা ফর্ম্যাটিংয়ের উপরে আমাদের সবসময় নিয়ন্ত্রণ থাকে না এবং অ্যান্ড্রয়েড এবং পাইথন (কমপক্ষে) ভগ্নাংশের যথাযথতার 6 ডিজিট সংরক্ষণ করে, কখনও কখনও মামলা অনুসরণ করা প্রয়োজন।
এলি বার্ক

4

ISO8601DateFormatterIOS10 বা আরও নতুন ব্যবহার করে Uses

DateFormatterআইওএস 9 বা তার বেশি বয়সীদের ব্যবহার করে।

সুইফট 4

protocol DateFormatterProtocol {
    func string(from date: Date) -> String
    func date(from string: String) -> Date?
}

extension DateFormatter: DateFormatterProtocol {}

@available(iOS 10.0, *)
extension ISO8601DateFormatter: DateFormatterProtocol {}

struct DateFormatterShared {
    static let iso8601: DateFormatterProtocol = {
        if #available(iOS 10, *) {
            return ISO8601DateFormatter()
        } else {
            // iOS 9
            let formatter = DateFormatter()
            formatter.calendar = Calendar(identifier: .iso8601)
            formatter.locale = Locale(identifier: "en_US_POSIX")
            formatter.timeZone = TimeZone(secondsFromGMT: 0)
            formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
            return formatter
        }
    }()
}

3

আমার ক্ষেত্রে আমাকে ডায়নামোডিবি - সর্বশেষ আপডেটকৃত কলাম (ইউনিক্স টাইমস্ট্যাম্প) নরমাল টাইমে রূপান্তর করতে হবে।

সর্বশেষ আপডেটের প্রাথমিক মানটি ছিল: 1460650607601 - 2016-04-14 16:16:47 +0000 এর মাধ্যমে রূপান্তরিত:

   if let lastUpdated : String = userObject.lastUpdated {

                let epocTime = NSTimeInterval(lastUpdated)! / 1000 // convert it from milliseconds dividing it by 1000

                let unixTimestamp = NSDate(timeIntervalSince1970: epocTime) //convert unix timestamp to Date
                let dateFormatter = NSDateFormatter()
                dateFormatter.timeZone = NSTimeZone()
                dateFormatter.locale = NSLocale.currentLocale() // NSLocale(localeIdentifier: "en_US_POSIX")
                dateFormatter.dateFormat =  "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
                dateFormatter.dateFromString(String(unixTimestamp))

                let updatedTimeStamp = unixTimestamp
                print(updatedTimeStamp)

            }

3

ভবিষ্যতে ফর্ম্যাটটি পরিবর্তন করার প্রয়োজন হতে পারে যা একটি ছোট মাথা ব্যথা হতে পারে যা ডেট.ডেটমোথ্রোমআইএস 608 অ্যাপ্লিকেশনে সর্বত্র কল করে। বাস্তবায়ন মোড়ানোর জন্য একটি ক্লাস এবং প্রোটোকল ব্যবহার করুন, এক জায়গায় ডেট টাইম ফর্ম্যাট কল পরিবর্তন করা সহজ হবে। সম্ভব হলে আরএফসি 3339 ব্যবহার করুন এটি আরও সম্পূর্ণ উপস্থাপনা। ডেটফর্ম্যাটপ্রোটোকল এবং ডেটফর্ম্যাট নির্ভরতা ইনজেকশনের জন্য দুর্দান্ত।

class AppDelegate: UIResponder, UIApplicationDelegate {

    internal static let rfc3339DateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
    internal static let localeEnUsPosix = "en_US_POSIX"
}

import Foundation

protocol DateFormatProtocol {

    func format(date: NSDate) -> String
    func parse(date: String) -> NSDate?

}


import Foundation

class DateFormat:  DateFormatProtocol {

    func format(date: NSDate) -> String {
        return date.rfc3339
    }

    func parse(date: String) -> NSDate? {
        return date.rfc3339
    }

}


extension NSDate {

    struct Formatter {
        static let rfc3339: NSDateFormatter = {
            let formatter = NSDateFormatter()
            formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)
            formatter.locale = NSLocale(localeIdentifier: AppDelegate.localeEnUsPosix)
            formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
            formatter.dateFormat = rfc3339DateFormat
            return formatter
        }()
    }

    var rfc3339: String { return Formatter.rfc3339.stringFromDate(self) }
}

extension String {
    var rfc3339: NSDate? {
        return NSDate.Formatter.rfc3339.dateFromString(self)
    }
}



class DependencyService: DependencyServiceProtocol {

    private var dateFormat: DateFormatProtocol?

    func setDateFormat(dateFormat: DateFormatProtocol) {
        self.dateFormat = dateFormat
    }

    func getDateFormat() -> DateFormatProtocol {
        if let dateFormatObject = dateFormat {

            return dateFormatObject
        } else {
            let dateFormatObject = DateFormat()
            dateFormat = dateFormatObject

            return dateFormatObject
        }
    }

}

3

একটি নতুন ISO8601DateFormatterশ্রেণি রয়েছে যা আসুন আপনি কেবল একটি লাইন দিয়ে স্ট্রিং তৈরি করুন। পিছনের সামঞ্জস্যের জন্য আমি একটি পুরানো সি-লাইব্রেরি ব্যবহার করেছি। আমি আশা করি এটি কারও জন্য কার্যকর is

সুইফট 3.0

extension Date {
    var iso8601: String {
        if #available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *) {
            return ISO8601DateFormatter.string(from: self, timeZone: TimeZone.current, formatOptions: .withInternetDateTime)
        } else {
            var buffer = [CChar](repeating: 0, count: 25)
            var time = time_t(self.timeIntervalSince1970)
            strftime_l(&buffer, buffer.count, "%FT%T%z", localtime(&time), nil)
            return String(cString: buffer)
        }
    }
}

1

লিও ডাবাসের সংস্করণটির পরিপূরক করতে, আমি সুইফট এবং অবজেক্টিভ-সি রচিত প্রকল্পগুলির জন্য সমর্থন যোগ করেছি, alচ্ছিক মিলিসেকেন্ডগুলির জন্য সমর্থনও যুক্ত করেছি, সম্ভবত সেরা না হলেও আপনি এই বিষয়টি পাবেন:

এক্সকোড 8 এবং সুইফট 3

extension Date {
    struct Formatter {
        static let iso8601: DateFormatter = {
            let formatter = DateFormatter()
            formatter.calendar = Calendar(identifier: .iso8601)
            formatter.locale = Locale(identifier: "en_US_POSIX")
            formatter.timeZone = TimeZone(secondsFromGMT: 0)
            formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
            return formatter
        }()
    }

    var iso8601: String {
        return Formatter.iso8601.string(from: self)
    }
}


extension String {
    var dateFromISO8601: Date? {
        var data = self
        if self.range(of: ".") == nil {
            // Case where the string doesn't contain the optional milliseconds
            data = data.replacingOccurrences(of: "Z", with: ".000000Z")
        }
        return Date.Formatter.iso8601.date(from: data)
    }
}


extension NSString {
    var dateFromISO8601: Date? {
        return (self as String).dateFromISO8601
    }
}

0

কিছু ম্যানুয়াল স্ট্রিং মাস্ক বা টাইমফর্ম্যাটর ছাড়াই

import Foundation

struct DateISO: Codable {
    var date: Date
}

extension Date{
    var isoString: String {
        let encoder = JSONEncoder()
        encoder.dateEncodingStrategy = .iso8601
        guard let data = try? encoder.encode(DateISO(date: self)),
        let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as?  [String: String]
            else { return "" }
        return json?.first?.value ?? ""
    }
}

let dateString = Date().isoString

এটি একটি ভাল উত্তর, তবে ব্যবহারের ক্ষেত্রে .iso8601মিলিসেকেন্ডগুলি অন্তর্ভুক্ত হবে না।
স্টিফান আরেন্তজ

0

কোনও বস্তুর দৃষ্টান্তে গ্রহণযোগ্য উত্তরের ভিত্তিতে

class ISO8601Format
{
    let format: ISO8601DateFormatter

    init() {
        let format = ISO8601DateFormatter()
        format.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
        format.timeZone = TimeZone(secondsFromGMT: 0)!
        self.format = format
    }

    func date(from string: String) -> Date {
        guard let date = format.date(from: string) else { fatalError() }
        return date
    }

    func string(from date: Date) -> String { return format.string(from: date) }
}


class ISO8601Time
{
    let date: Date
    let format = ISO8601Format() //FIXME: Duplication

    required init(date: Date) { self.date = date }

    convenience init(string: String) {
        let format = ISO8601Format() //FIXME: Duplication
        let date = format.date(from: string)
        self.init(date: date)
    }

    func concise() -> String { return format.string(from: date) }

    func description() -> String { return date.description(with: .current) }
}

callsite

let now = Date()
let time1 = ISO8601Time(date: now)
print("time1.concise(): \(time1.concise())")
print("time1: \(time1.description())")


let time2 = ISO8601Time(string: "2020-03-24T23:16:17.661Z")
print("time2.concise(): \(time2.concise())")
print("time2: \(time2.description())")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.