আপনি কীভাবে একটি সুইট এক্সকোডের তারিখ থেকে একটি তারিখ অবজেক্ট তৈরি করবেন।
যেমন জাভাস্ক্রিপ্ট আপনি করতে হবে:
var day = new Date('2014-05-20');
আপনি কীভাবে একটি সুইট এক্সকোডের তারিখ থেকে একটি তারিখ অবজেক্ট তৈরি করবেন।
যেমন জাভাস্ক্রিপ্ট আপনি করতে হবে:
var day = new Date('2014-05-20');
উত্তর:
সুইফটের নিজস্ব 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
সমর্থন।
কীভাবে পাঠযোগ্য বিন্যাসে তারিখ এবং সময় প্রদর্শিত হবে তার জন্য আমার পূর্ণ উত্তর দেখুন । এই দুর্দান্ত নিবন্ধগুলি পড়ুন:
বিদ্যমান 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 ।
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)
}
}
NSDateFormatter
প্রতিটি সময় ফাংশনটি অ্যাক্সেস করা হলে পুনরায় তৈরি করা হয়। হিসাবে তারিখ বিন্যাস গাইড যুক্তরাষ্ট্রের একটি তারিখ ফরম্যাটার একটি সস্তা অপারেশন নয় তৈরি করা হচ্ছে । এছাড়াও, ক্লাসটি iOS7 সাল থেকে থ্রেড-নিরাপদ, সুতরাং যে কোনও একটি এটি সমস্ত NSDate
এক্সটেনশনের জন্য নিরাপদে ব্যবহার করতে পারে ।
সুইফ্টের নিজস্ব তারিখের प्रकार নেই তবে বিদ্যমান কোকোয়া 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)
NSDateFormatter
পদ্ধতির জন্য "yyyy-MM-dd" সহ একটি স্ট্রিং "1979-07-01" date(from:)
। এটি ফিরে আসে nil
। আমি এই সমস্যাটি ফ্যাব্রিক.আইও ক্র্যাশ লগটিতে পেয়েছি।
আমি এটি 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)
dateComponents
অ্যাপল ডকুমেন্টেশন অনুযায়ী
উদাহরণ:
var myObject = NSDate()
let futureDate = myObject.dateByAddingTimeInterval(10)
let timeSinceNow = myObject.timeIntervalSinceNow
ইন, সুইফট 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)
}
}
ব্যক্তিগতভাবে আমি মনে করি এটি একটি অনুপযুক্ত আরম্ভকারী হওয়া উচিত:
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
}
}
}
অন্যথায় একটি অবৈধ বিন্যাস সহ একটি স্ট্রিং একটি ব্যতিক্রম উত্থাপন করবে।
@ মাইথজ উত্তর অনুসারে আমি 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
পদ্ধতি ব্যবহার করি না তবে কারও যদি প্রয়োজন হয় তবে আমি এই পোস্টটি আপডেট করব।
আমার প্রায়শই এক স্থান থেকে অন্যের জন্য সময়ের মানগুলির সাথে তারিখের মানগুলি একত্রিত করা প্রয়োজন। এটি সম্পাদন করার জন্য আমি একটি সহায়ক ফাংশন লিখেছি।
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)!
অ্যাপলের ডেটা ফর্ম্যাটিং গাইড অনুসারে
একটি তারিখ বিন্যাস তৈরি করা কোনও সস্তা কাজ নয়। আপনি যদি প্রায়শই একটি বিন্যাস ব্যবহার করতে চান তবে একাধিক উদাহরণ তৈরি এবং নিষ্পত্তি করার চেয়ে একক দৃষ্টিতে ক্যাশে করা সাধারণত কার্যকর 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 }
NSDate
অবজেক্টিভ-সি এর মতোই ব্যবহার করবেন ?