আপনি কীভাবে একটি সুইফট ডেট অবজেক্ট তৈরি করবেন?


156

আপনি কীভাবে একটি সুইট এক্সকোডের তারিখ থেকে একটি তারিখ অবজেক্ট তৈরি করবেন।

যেমন জাভাস্ক্রিপ্ট আপনি করতে হবে: var day = new Date('2014-05-20');


10
NSDateঅবজেক্টিভ-সি এর মতোই ব্যবহার করবেন ?
rmaddy

উত্তর:


263

সুইফটের নিজস্ব Dateধরণ রয়েছে। ব্যবহার করার দরকার নেই NSDate

সুইফটে একটি তারিখ এবং সময় তৈরি করা

সুইফ্টে, তারিখ এবং সময়গুলি একটি 64-বিট ভাসমান পয়েন্ট সংখ্যাতে সেকেন্ডের সংখ্যা পরিমাপ করে 1 জানুয়ারী, 2001-এর 00:00:00 ইউটিসি- তে রেফারেন্সের তারিখ থেকে সেকেন্ডের সংখ্যা পরিমাপ করে । এটি Dateকাঠামোর মধ্যে প্রকাশ করা হয় । নিম্নলিখিতটি আপনাকে বর্তমান তারিখ এবং সময় দেবে:

let currentDateTime = Date()

অন্যান্য তারিখ-সময় তৈরির জন্য, আপনি নিম্নলিখিত পদ্ধতির একটি ব্যবহার করতে পারেন।

পদ্ধতি 1

আপনি যদি 2001 এর রেফারেন্স তারিখের আগে বা তার পরে সেকেন্ডের সংখ্যাটি জানেন তবে আপনি এটি ব্যবহার করতে পারেন।

let someDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM

পদ্ধতি 2

অবশ্যই, এটি তৈরির জন্য বছর, মাস, দিন এবং ঘন্টা (আপেক্ষিক সেকেন্ডের চেয়ে) এর মতো জিনিস ব্যবহার করা সহজ হবে Date। এর জন্য আপনি DateComponentsউপাদানগুলি নির্দিষ্ট করতে এবং তারপরে Calendarতারিখটি তৈরি করতে ব্যবহার করতে পারেন । Calendarদেয় Dateপ্রসঙ্গ। অন্যথায়, এটি কীভাবে জানবে যে এটি কোন টাইম জোন বা ক্যালেন্ডারে প্রকাশ করবে?

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1980
dateComponents.month = 7
dateComponents.day = 11
dateComponents.timeZone = TimeZone(abbreviation: "JST") // Japan Standard Time
dateComponents.hour = 8
dateComponents.minute = 34

// Create date from components
let userCalendar = Calendar.current // user calendar
let someDateTime = userCalendar.date(from: dateComponents)

অন্যান্য সময় অঞ্চল সংক্ষিপ্ত বিবরণ এখানে পাওয়া যাবে । যদি আপনি সেই শূন্যস্থান ছেড়ে যান, তবে ব্যবহারকারীর সময় অঞ্চলটি ব্যবহার করা ডিফল্ট।

পদ্ধতি 3

সর্বাধিক সংক্ষিপ্ত উপায় (তবে অগত্যা সেরা নয়) ব্যবহার করা যেতে পারে DateFormatter

let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let someDateTime = formatter.date(from: "2016/10/08 22:31")

ইউনিকোড কারিগরী মান অন্যান্য ফরম্যাটের দেন যে DateFormatterসমর্থন।

মন্তব্য

কীভাবে পাঠযোগ্য বিন্যাসে তারিখ এবং সময় প্রদর্শিত হবে তার জন্য আমার পূর্ণ উত্তর দেখুন । এই দুর্দান্ত নিবন্ধগুলি পড়ুন:


118

বিদ্যমান NSDateক্লাসে এক্সটেনশন ব্যবহার করে এটি করা ভাল ।

নিম্নলিখিত এক্সটেনশানটিতে একটি নতুন ইনিশিয়ালাইজার যুক্ত হয়েছে যা আপনার নির্দিষ্ট বিন্যাসে তারিখের স্ট্রিং ব্যবহার করে বর্তমান লোকালে একটি তারিখ তৈরি করবে।

extension NSDate
{
    convenience
      init(dateString:String) {
      let dateStringFormatter = NSDateFormatter()
      dateStringFormatter.dateFormat = "yyyy-MM-dd"
      dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
      let d = dateStringFormatter.dateFromString(dateString)!
      self.init(timeInterval:0, sinceDate:d)
    }
 }

এখন আপনি সুইফট থেকে কেবল এনএসডিট তৈরি করতে পারেন:

NSDate(dateString:"2014-06-06")

দয়া করে মনে রাখবেন যে এই বাস্তবায়নটি এনএসডিট ফরমেটারটিকে ক্যাশে করে না, যা আপনি যদি এইভাবে অনেকগুলি তৈরি করার আশা করেন তবে পারফরম্যান্সের কারণে আপনি এটি করতে চাইতে পারেন NSDate

দয়া করে নোট করুন যে আপনি যদি NSDateকোনও স্ট্রিং যা সঠিকভাবে পার্স করতে পারবেন না তা পেরিয়ে একটি আরম্ভ করার চেষ্টা করলে এই বাস্তবায়নটি কেবল ক্র্যাশ হয়ে যাবে। এটি বাধ্যতামূলকভাবে theচ্ছিক মানটি ফেরত আনার কারণে আসে dateFromString। আপনি যদি nilখারাপ পার্সে কোনও ফেরত দিতে চান, আপনি আদর্শভাবে একটি ব্যর্থ আরম্ভকারী ব্যবহার করবেন; তবে আপনি এখনই এটি করতে পারবেন না (জুন ২০১৫), সুইফট ১.২ এর সীমাবদ্ধতার কারণে, তাই আপনি পরবর্তী সেরা পছন্দটি একটি ক্লাস ফ্যাক্টরি পদ্ধতি ব্যবহার করা।

আরও বিস্তৃত উদাহরণ, যা উভয় সমস্যার সমাধান করে, এখানে: https://gist.github.com/algal/09b08515460b7bd229fa


সুইফট 5 এর জন্য আপডেট

extension Date {
    init(_ dateString:String) {
        let dateStringFormatter = DateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd"
        dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
        let date = dateStringFormatter.date(from: dateString)!
        self.init(timeInterval:0, since:date)
    }
}

9
সুতরাং এখানে "সুবিধা" শব্দটি কী করে?
জেমস বার্নস

18
এটি নির্দেশ করে যে এক্সটেনশানটি এমন একটি প্রাথমিককরণ সরবরাহ করে যা বাস্তবে ইতিমধ্যে বিদ্যমান মনোনীত আরম্ভকারীকে প্রাথমিকভাবে প্রতিনিধিত্ব করে, যা এই ক্ষেত্রে NSDate.init (সময়সংশ্লিষ্ট:, যেহেতু তারিখ :) ইনিশিয়ালাইজার। এটি সুইফ্ট প্রোগ্রামিং ভাষা বইয়ের 275 পৃষ্ঠায় বর্ণিত হয়েছে।
অ্যালগাল

1
উপরের কোডটিতে আমি দেখতে পেয়েছি এমন একটি ত্রুটি NSDateFormatterপ্রতিটি সময় ফাংশনটি অ্যাক্সেস করা হলে পুনরায় তৈরি করা হয়। হিসাবে তারিখ বিন্যাস গাইড যুক্তরাষ্ট্রের একটি তারিখ ফরম্যাটার একটি সস্তা অপারেশন নয় তৈরি করা হচ্ছে । এছাড়াও, ক্লাসটি iOS7 সাল থেকে থ্রেড-নিরাপদ, সুতরাং যে কোনও একটি এটি সমস্ত NSDateএক্সটেনশনের জন্য নিরাপদে ব্যবহার করতে পারে ।
ইয়েভেন ডাবিনিন

@ ইউজেনডুবিনিন সঠিক এ কারণেই আমি বলেছিলাম "এই প্রয়োগকরণটি এনএসডিট ফরমেটারটিকে ক্যাশে করে না, যা আপনি পারফরম্যান্সের কারণে করতে চাইতে পারেন"।
অ্যালগাল

1
সুইফট ১.২ এ সীমাবদ্ধতা কত? সুইফট ১.১ থেকে বৈশিষ্ট্যটি "অনুপল আরম্ভকারী" উপলব্ধ
ফ্রাঙ্কলিন ইউ

48

সুইফ্টের নিজস্ব তারিখের प्रकार নেই তবে বিদ্যমান কোকোয়া NSDateপ্রকারটি ব্যবহার করতে আপনি যেমন:

class Date {

    class func from(year: Int, month: Int, day: Int) -> Date {
        let gregorianCalendar = NSCalendar(calendarIdentifier: .gregorian)!

        var dateComponents = DateComponents()
        dateComponents.year = year
        dateComponents.month = month
        dateComponents.day = day

        let date = gregorianCalendar.date(from: dateComponents)!
        return date
    }

    class func parse(_ string: String, format: String = "yyyy-MM-dd") -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = NSTimeZone.default
        dateFormatter.dateFormat = format

        let date = dateFormatter.date(from: string)!
        return date
    }
}

যা আপনি ব্যবহার করতে পারেন:

var date = Date.parse("2014-05-20")
var date = Date.from(year: 2014, month: 05, day: 20)

আমাকে লাইনটি পরিবর্তন করতে হয়েছিল: var তারিখ = গ্রেগরিয়ান? ডেটফ্রোমকম্পোন্টস (সি) তবে কেন বুঝতে পারছি না, এবং পার্স রিটার্ন ডেটএফএমটি.ডেটফ্র্যামস্ট্রিংও অভিযোগ করছে। কোন সংকেত সনাক্ত করুন? আহ, আমি ফাংশনটির রিটার্নের ধরণটি এনএসডিট থেকে এনএসডিটে পরিবর্তন করেছি? এটি এটি সংকলন করতে দেয়। তবে কেন নিশ্চিত হ'ল এটিকে কেন আবদ্ধ করা দরকার।
সিনেটর

1
@ দ্য সিনেটর এনএসক্যালেন্ডার ইন একটি alচ্ছিক (?) ফিরিয়ে দেয় যাতে গ্রেগরীয়ান একটি alচ্ছিক (?)। Greচ্ছিক চেইনিং এ greচ্ছিক প্রয়োজনে এটিকে অ্যাক্সেস করার জন্য এতগুলি গ্রেগরিয়ান? ডেটফ্রোমকোম্পোন্টসগুলি বিকল্প গ্রেগরিয়ান (এনএসসিএলগ্রাডার) থেকে মানটি মোড়ক করতে ptionচ্ছিক চেইন। এখানে
ptionচ্ছিক শৃঙ্খলার

এনএসগ্রাগোরিয়ান ক্যালেন্ডার আইওএস 8 হিসাবে অবনতি হয়েছে সুতরাং এর পরিবর্তে এনএসসিএলএন্ডার্ডিফায়ার গ্রেগরিয়ান ব্যবহার করুন
অ্যাডাম নাইটস

2
@ সিনেটর অভিযোগ করেছেন কোজ সুইফটের ডেট স্ট্রাক্ট রয়েছে এবং এই কোডটি আবার শ্রেণিকালীন হিসাবে পুনরায় তারিখ করেছে। সুতরাং আপনার মতো কিছু করা উচিত: 'এক্সটেনশনের তারিখ' এবং 'স্ট্যাটিক ফানক'
জাপোরোজচেনকো ওলেকসান্দার

তারিখে ফিরে পার্স স্ট্রিং সম্পর্কে একটি মেমো। NSDateFormatterপদ্ধতির জন্য "yyyy-MM-dd" সহ একটি স্ট্রিং "1979-07-01" date(from:)। এটি ফিরে আসে nil। আমি এই সমস্যাটি ফ্যাব্রিক.আইও ক্র্যাশ লগটিতে পেয়েছি।
AechoLiu

12

আমি এটি 4.2 সুইফটে কীভাবে করেছি:

extension Date {

    /// Create a date from specified parameters
    ///
    /// - Parameters:
    ///   - year: The desired year
    ///   - month: The desired month
    ///   - day: The desired day
    /// - Returns: A `Date` object
    static func from(year: Int, month: Int, day: Int) -> Date? {
        let calendar = Calendar(identifier: .gregorian)
        var dateComponents = DateComponents()
        dateComponents.year = year
        dateComponents.month = month
        dateComponents.day = day
        return calendar.date(from: dateComponents) ?? nil
    }
}

ব্যবহার:

let marsOpportunityLaunchDate = Date.from(year: 2003, month: 07, day: 07)

যদিও আমি '15 'পেরিয়ে যাচ্ছি দিন হিসাবে 14 তারিখ ফিরে আসে? থটস?
লুক জম্মিট

@ লুকেজ্যামিট এতে টাইমজোন যুক্ত করুনdateComponents
অ্যাড্রিয়ান

কোন ভাগ্য ছাড়াই এটি চেষ্টা করে দেখুন - ডেটকম্পোন্টস.টাইমজোন = টাইমজোন.কন্টেন, ভাবনা দয়া করে?
লুক জমিট 18


4

ইন, সুইফট 3.0 আপনি এইভাবে তারিখ অবজেক্ট সেট করেছেন।

extension Date
{
    init(dateString:String) {
        let dateStringFormatter = DateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd"
        dateStringFormatter.locale = Locale(identifier: "en_US_POSIX")
        let d = dateStringFormatter.date(from: dateString)!
        self(timeInterval:0, since:d)
    }
}

@ Zonker.in.Genva আপনি যেখানেই চান। পৃথক ফাইল তৈরি করুন, এটিকে "এক্সটেনশন", আইডিকে কল করুন।
জাপোরোজচেনকো ওলেকসান্দ্র

2

ব্যক্তিগতভাবে আমি মনে করি এটি একটি অনুপযুক্ত আরম্ভকারী হওয়া উচিত:

extension Date {

    init?(dateString: String) {
        let dateStringFormatter = DateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd"
        if let d = dateStringFormatter.date(from: dateString) {
            self.init(timeInterval: 0, since: d)
        } else {
            return nil
        }
    }
}

অন্যথায় একটি অবৈধ বিন্যাস সহ একটি স্ট্রিং একটি ব্যতিক্রম উত্থাপন করবে।


2

@ মাইথজ উত্তর অনুসারে আমি swift3সিনট্যাক্স ব্যবহার করে তার এক্সটেনশনের আপডেট হওয়া সংস্করণ পোস্ট করার সিদ্ধান্ত নিয়েছি ।

extension Date {
    static func from(_ year: Int, _ month: Int, _ day: Int) -> Date?
    {
        let gregorianCalendar = Calendar(identifier: .gregorian)
        let dateComponents = DateComponents(calendar: gregorianCalendar, year: year, month: month, day: day)
        return gregorianCalendar.date(from: dateComponents)
    }
}

আমি parseপদ্ধতি ব্যবহার করি না তবে কারও যদি প্রয়োজন হয় তবে আমি এই পোস্টটি আপডেট করব।


1

আমার প্রায়শই এক স্থান থেকে অন্যের জন্য সময়ের মানগুলির সাথে তারিখের মানগুলি একত্রিত করা প্রয়োজন। এটি সম্পাদন করার জন্য আমি একটি সহায়ক ফাংশন লিখেছি।

let startDateTimeComponents = NSDateComponents()
startDateTimeComponents.year = NSCalendar.currentCalendar().components(NSCalendarUnit.Year, fromDate: date).year
startDateTimeComponents.month = NSCalendar.currentCalendar().components(NSCalendarUnit.Month, fromDate: date).month
startDateTimeComponents.day = NSCalendar.currentCalendar().components(NSCalendarUnit.Day, fromDate: date).day
startDateTimeComponents.hour = NSCalendar.currentCalendar().components(NSCalendarUnit.Hour, fromDate: time).hour
startDateTimeComponents.minute = NSCalendar.currentCalendar().components(NSCalendarUnit.Minute, fromDate: time).minute
let startDateCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
combinedDateTime = startDateCalendar!.dateFromComponents(startDateTimeComponents)!

0

অ্যাপলের ডেটা ফর্ম্যাটিং গাইড অনুসারে

একটি তারিখ বিন্যাস তৈরি করা কোনও সস্তা কাজ নয়। আপনি যদি প্রায়শই একটি বিন্যাস ব্যবহার করতে চান তবে একাধিক উদাহরণ তৈরি এবং নিষ্পত্তি করার চেয়ে একক দৃষ্টিতে ক্যাশে করা সাধারণত কার্যকর more একটি পদ্ধতির স্ট্যাটিক ভেরিয়েবল ব্যবহার করা হয়

এবং আমি @ লিওনের সাথে একমত হয়েছি যে এটি অনুপযুক্ত প্রারম্ভিক হওয়া উচিত, যখন আপনি বীজের ডেটা প্রবেশ করেন, তখন আমাদের কাছে এমনটি থাকতে পারে যা পাওয়া যায় না (ঠিক যেমন রয়েছে UIImage(imageLiteralResourceName:))।

সুতরাং এখানে আমার পদ্ধতির:

extension DateFormatter {
  static let yyyyMMdd: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.calendar = Calendar(identifier: .iso8601)
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    formatter.locale = Locale(identifier: "en_US_POSIX")
    return formatter
  }()
}

extension Date {
    init?(yyyyMMdd: String) {
        guard let date = DateFormatter.yyyyMMdd.date(from: yyyyMMdd) else { return nil }
        self.init(timeInterval: 0, since: date)
    }

    init(dateLiteralString yyyyMMdd: String) {
        let date = DateFormatter.yyyyMMdd.date(from: yyyyMMdd)!
        self.init(timeInterval: 0, since: date)
    }
}

এবং এখন কেবল কল করা উপভোগ করুন:

// For seed data
Date(dateLiteralString: "2020-03-30")

// When parsing data
guard let date = Date(yyyyMMdd: "2020-03-30") else { return nil }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.