J'ai créé une méthode qui est censée prendre une chaîne sous la forme "AAAA-MM-JJ" et cracher un int qui représente la position des dates par rapport à la semaine dans laquelle elle se trouve (peu importe si elle se chevauche entre les mois). Donc par exemple dimanche = 1 lundi = 2 et ainsi de suite.
Voici mon code:
func getDayOfWeek(today:String)->Int{
var formatter:NSDateFormatter = NSDateFormatter()
formatter.dateFormat = "YYYY-MM-DD"
var todayDate:NSDate = formatter.dateFromString(today)!
var myCalendar:NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
var myComponents = myCalendar.components(NSCalendarUnit.WeekdayOrdinalCalendarUnit, fromDate: todayDate)
var weekDay = myComponents.weekdayOrdinal
return weekDay
}
Je sais que NSCalendarUnit.WeekdayOrdinalCalendar
c'est faux mais j'ai essayé, je pense, les combinaisons les plus logiques. Et ont aussi déconné avec myComponents.weekdayOrdinal
par exemple utilisé mycomponents.day
ou .weekday
.
Voici mes options d'utilisation:
static var EraCalendarUnit: NSCalendarUnit { get }
static var YearCalendarUnit: NSCalendarUnit { get }
static var MonthCalendarUnit: NSCalendarUnit { get }
static var DayCalendarUnit: NSCalendarUnit { get }
static var HourCalendarUnit: NSCalendarUnit { get }
static var MinuteCalendarUnit: NSCalendarUnit { get }
static var SecondCalendarUnit: NSCalendarUnit { get }
static var WeekCalendarUnit: NSCalendarUnit { get }
static var WeekdayCalendarUnit: NSCalendarUnit { get }
static var WeekdayOrdinalCalendarUnit: NSCalendarUnit { get }
static var QuarterCalendarUnit: NSCalendarUnit { get }
static var WeekOfMonthCalendarUnit: NSCalendarUnit { get }
static var WeekOfYearCalendarUnit: NSCalendarUnit { get }
static var YearForWeekOfYearCalendarUnit: NSCalendarUnit { get }
static var CalendarCalendarUnit: NSCalendarUnit { get }
static var TimeZoneCalendarUnit: NSCalendarUnit { get }
Ce n'est pas clair pour moi car il n'y a pas d'option DayOfWeekUnit (ou quelque chose de similaire).
swift
nsdate
nscalendar
Boidkan
la source
la source
Réponses:
Ce que vous recherchez (si je comprends bien la question) est
NSCalendarUnit.CalendarUnitWeekday
. La propriété correspondante deNSDateComponents
estweekday
.Notez également que votre format de date est incorrect (la spécification complète peut être trouvée ici: http://unicode.org/reports/tr35/tr35-6.html ).
La fonction peut être légèrement simplifiée, en utilisant l'inférence de type automatique, vous utilisez également beaucoup de variables où les constantes sont suffisantes. De plus, la fonction doit renvoyer un optionnel qui est
nil
à une chaîne d'entrée non valide.Code mis à jour pour Swift 3 et versions ultérieures:
func getDayOfWeek(_ today:String) -> Int? { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" guard let todayDate = formatter.date(from: today) else { return nil } let myCalendar = Calendar(identifier: .gregorian) let weekDay = myCalendar.component(.weekday, from: todayDate) return weekDay }
Exemple:
if let weekday = getDayOfWeek("2014-08-27") { print(weekday) } else { print("bad input") }
Réponse originale pour Swift 2:
func getDayOfWeek(today:String)->Int? { let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd" if let todayDate = formatter.dateFromString(today) { let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! let myComponents = myCalendar.components(.Weekday, fromDate: todayDate) let weekDay = myComponents.weekday return weekDay } else { return nil } }
la source
func getDayOfWeek(today:String)->Int?
. Si vous forcez le déballage de l'option, il plante toujours, n'est-ce pas?if let ...
fonctionne également avec des options implicitement non emballées.Swift 3 et 4
La récupération du numéro du jour de la semaine est considérablement simplifiée dans Swift 3 car elle
DateComponents
n'est plus facultative. Le voici en extension:extension Date { func dayNumberOfWeek() -> Int? { return Calendar.current.dateComponents([.weekday], from: self).weekday } } // returns an integer from 1 - 7, with 1 being Sunday and 7 being Saturday print(Date().dayNumberOfWeek()!) // 4
Si vous recherchez la version écrite et localisée du jour de la semaine:
extension Date { func dayOfWeek() -> String? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEEE" return dateFormatter.string(from: self).capitalized // or use capitalized(with: locale) if you want } } print(Date().dayOfWeek()!) // Wednesday
la source
Si vous voulez le «dimanche», «lundi», «mardi», «mercredi», etc.
EDIT: Il existe en fait un format intégré qui renvoie les noms de jour localisés:
extension NSDate { func dayOfTheWeek() -> String? { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "EEEE" return dateFormatter.stringFromDate(self) } }
Ma solution précédente (pour l'anglais uniquement):
extension NSDate { func dayOfTheWeek() -> String? { let weekdays = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ] let calendar: NSCalendar = NSCalendar.currentCalendar() let components: NSDateComponents = calendar.components(.Weekday, fromDate: self) return weekdays[components.weekday - 1] } }
Vous n'avez pas besoin de déballer le calendrier et les composants, ils sont garantis par le framework de base.
Usage:
print(myDate.dayOfTheWeek())
la source
La réponse simple (rapide 3):
Calendar.current.component(.weekday, from: Date())
la source
Dans mon cas, je cherchais une chaîne de trois lettres pour chaque jour. J'ai modifié la fonction de @Martin R comme suit:
func getDayOfWeekString(today:String)->String? { let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd" if let todayDate = formatter.dateFromString(today) { let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! let myComponents = myCalendar.components(.Weekday, fromDate: todayDate) let weekDay = myComponents.weekday switch weekDay { case 1: return "Sun" case 2: return "Mon" case 3: return "Tue" case 4: return "Wed" case 5: return "Thu" case 6: return "Fri" case 7: return "Sat" default: print("Error fetching days") return "Day" } } else { return nil } }
la source
dateFormat
Il existe un moyen plus simple. Passez simplement votre chaîne de date à la fonction suivante, elle vous donnera le nom du jour :)
func getDayNameBy(stringDate: String) -> String { let df = NSDateFormatter() df.dateFormat = "YYYY-MM-dd" let date = df.dateFromString(stringDate)! df.dateFormat = "EEEE" return df.stringFromDate(date); }
la source
extension Date { var weekdayName: String { let formatter = DateFormatter(); formatter.dateFormat = "E" return formatter.string(from: self as Date) } var weekdayNameFull: String { let formatter = DateFormatter(); formatter.dateFormat = "EEEE" return formatter.string(from: self as Date) } var monthName: String { let formatter = DateFormatter(); formatter.dateFormat = "MMM" return formatter.string(from: self as Date) } var OnlyYear: String { let formatter = DateFormatter(); formatter.dateFormat = "YYYY" return formatter.string(from: self as Date) } var period: String { let formatter = DateFormatter(); formatter.dateFormat = "a" return formatter.string(from: self as Date) } var timeOnly: String { let formatter = DateFormatter(); formatter.dateFormat = "hh : mm" return formatter.string(from: self as Date) } var timeWithPeriod: String { let formatter = DateFormatter(); formatter.dateFormat = "hh : mm a" return formatter.string(from: self as Date) } var DatewithMonth: String { let formatter = DateFormatter(); formatter.dateStyle = .medium ; return formatter.string(from: self as Date) } }
utilisation let jour de la semaine = Date (). nom de la semaine
la source
Extension de date Swift 3
extension Date { var weekdayOrdinal: Int { return Calendar.current.component(.weekday, from: self) } }
la source
Vous pouvez utiliser cette table date_formats pour convertir votre date en différents formats. Mon code le plus court:
func getDayOfWeek(today: String) -> Int{ let formatter:NSDateFormatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd" let todayDate = formatter.dateFromString(today) formatter.dateFormat = "e" // "eeee" -> Friday let weekDay = formatter.stringFromDate(todayDate!) return Int(weekDay)! } getDayOfWeek("2015-12-18") // 6
la source
SWIFT 5 - Jour de la semaine
extension Date { var dayofTheWeek: String { let dayNumber = Calendar.current.component(.weekday, from: self) // day number starts from 1 but array count from 0 return daysOfTheWeek[dayNumber - 1] } private var daysOfTheWeek: [String] { return ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] } }
Extension de date basée sur la réponse de Fattie
la source
La solution pratique ...
Sachez que les résultats sont les entiers de un à sept.
(Pas de zéro à six.)
let trivialDayStringsORDINAL = ["", "SUN","MON","TUE","WED","THU","FRI","SAT"] // note that zero is not used
puis ...
let dow = Calendar.current.component(.weekday, from: someDate) print( trivialDayStringsORDINAL[dow] )
la source
Il y a déjà beaucoup de réponses ici, mais je pense qu'il y a une autre façon, peut-être meilleure, de le faire en utilisant le bon
Calendar
API .Je suggère d'obtenir le jour de la semaine en utilisant la
weekdaySymbols
propriété deCalendar
( docs ) dans une extension àDate
:extension Date { /// Returns the day of the week as a `String`, e.g. "Monday" var dayOfWeek: String { let calendar = Calendar.autoupdatingCurrent return calendar.weekdaySymbols[calendar.component(.weekday, from: self) - 1] } }
Cela nécessite d'initialiser un
Date
premier, ce que je ferais en utilisant un customDateFormatter
:extension DateFormatter { /// returns a `DateFormatter` with the format "yyyy-MM-dd". static var standardDate: DateFormatter { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" return formatter } }
Cela peut alors être appelé avec:
DateFormatter.standardDate.date(from: "2018-09-18")!.dayOfWeek
Pourquoi je préfère ceci:
dayOfWeek
n'a pas à se soucier des fuseaux horaires car le calendrier de l'utilisateur est utilisé, certaines des autres solutions présentées ici afficheront le jour incorrect car les fuseaux horaires ne sont pas pris en compte.DateFormatter
et l'utiliser à la place?weekdaySymbols
est localisé pour vous.weekDaySymbols
peut être remplacé par d'autres options telles queshortWeekdaySymbols
"Mon", "Mar", etc.Remarque: cet exemple
DateFormatter
ne prend pas non plus en compte les fuseaux horaires ou les paramètres régionaux, vous devrez les définir en fonction de vos besoins. Si les dates sont toujours précises, envisagez de définir le fuseau horaireTimeZone(secondsFromGMT: 0)
.la source
weekdaySymbols
, merciJ'ai fini par avoir besoin de quelques chaînes de plus de la date, y compris la date de la semaine (par exemple "5") et le mois de l'année (par exemple août). Vous trouverez ci-dessous les trois fonctions que j'ai créées sur la base de la fonction de @Martin R et modifiées pour renvoyer 3 chaînes de caractères:
//Date String Helper Functions func getDayOfWeek(today:String)->String? { let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd" if let todayDate = formatter.dateFromString(today) { let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! let myComponents = myCalendar.components(.Weekday, fromDate: todayDate) let weekDay = myComponents.weekday switch weekDay { case 1: return "Sun" case 2: return "Mon" case 3: return "Tue" case 4: return "Wed" case 5: return "Thu" case 6: return "Fri" case 7: return "Sat" default: print("Error fetching days") return "Day" } } else { return nil } } func getDateOfMonth(today:String)->String? { let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd" if let todayDate = formatter.dateFromString(today) { let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! let myComponents = myCalendar.components(.Day, fromDate: todayDate) let weekDay = myComponents.day switch weekDay { case 1: return "1st" case 2: return "2nd" case 3: return "3rd" case 4: return "4th" case 5: return "5th" case 6: return "6th" case 7: return "7th" case 8: return "8th" case 9: return "9th" case 10: return "10th" case 11: return "11th" case 12: return "12th" case 13: return "13th" case 14: return "14th" case 15: return "15th" case 16: return "16th" case 17: return "17th" case 18: return "18th" case 19: return "19th" case 20: return "20th" case 21: return "21st" case 22: return "22nd" case 23: return "23rd" case 24: return "24th" case 25: return "25th" case 26: return "26th" case 27: return "27th" case 28: return "28th" case 29: return "29th" case 30: return "30th" case 31: return "31st" default: print("Error fetching Date Of Month") return "Day" } } else { return nil } } func getMonthOfYear(today:String)->String? { let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd" if let todayDate = formatter.dateFromString(today) { let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! let myComponents = myCalendar.components(.Month, fromDate: todayDate) let month = myComponents.month switch month { case 1: return "Jan" case 2: return "Feb" case 3: return "Mar" case 4: return "Apr" case 5: return "May" case 6: return "Jun" case 7: return "Jul" case 8: return "Aug" case 9: return "Sep" case 10: return "Oct" case 11: return "Nov" case 12: return "Dec" default: print("Error fetching months") return "Month" } } else { return nil } }
la source
Code SWIFT 2.0 pour présenter la semaine en cours à partir du lundi.
@IBAction func show (expéditeur: AnyObject) {
// Getting Days of week corresponding to their dateFormat let calendar = NSCalendar.currentCalendar() let dayInt: Int! var weekDate: [String] = [] var i = 2 print("Dates corresponding to days are") while((dayInt - dayInt) + i < 9) { let weekFirstDate = calendar.dateByAddingUnit(.Day, value: (-dayInt+i), toDate: NSDate(), options: []) let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "EEEE dd MMMM" let dayOfWeekString = dateFormatter.stringFromDate(weekFirstDate!) weekDate.append(dayOfWeekString) i++ } for i in weekDate { print(i) //Printing the day stored in array } } // function to get week day func getDayOfWeek(today:String)->Int { let formatter = NSDateFormatter() formatter.dateFormat = "MMM-dd-yyyy" let todayDate = formatter.dateFromString(today)! let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! let myComponents = myCalendar.components(.Weekday, fromDate: todayDate) let weekDay = myComponents.weekday return weekDay } @IBAction func DateTitle(sender: AnyObject) { // Getting currentDate and weekDay corresponding to it let currentDate = NSDate() let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "MMM-dd-yyyy" let dayOfWeekStrings = dateFormatter.stringFromDate(currentDate) dayInt = getDayOfWeek(dayOfWeekStrings) }
la source
Ce code permet de retrouver toute la semaine en cours. Il est écrit en Swift 2.0:
var i = 2 var weekday: [String] = [] var weekdate: [String] = [] var weekmonth: [String] = [] @IBAction func buttonaction(sender: AnyObject) { let currentDate = NSDate() let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "MMM-dd-yyyy" let dayOfWeekStrings = dateFormatter.stringFromDate(currentDate) let weekdays = getDayOfWeek(dayOfWeekStrings) let calendar = NSCalendar.currentCalendar() while((weekdays - weekdays) + i < 9) { let weekFirstDate = calendar.dateByAddingUnit(.Day, value: (-weekdays+i), toDate: NSDate(), options: []) let dayFormatter = NSDateFormatter() dayFormatter.dateFormat = "EEEE" let dayOfWeekString = dayFormatter.stringFromDate(weekFirstDate!) weekday.append(dayOfWeekString) let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "dd" let dateOfWeekString = dateFormatter.stringFromDate(weekFirstDate!) weekdate.append(dateOfWeekString) let monthFormatter = NSDateFormatter() monthFormatter.dateFormat = "MMMM" let monthOfWeekString = monthFormatter.stringFromDate(weekFirstDate!) weekmonth.append(monthOfWeekString) i++ } for(var j = 0; j<7 ; j++) { let day = weekday[j] let date = weekdate[j] let month = weekmonth[j] var wholeweek = date + "-" + month + "(" + day + ")" print(wholeweek) } } func getDayOfWeek(today:String)->Int { let formatter = NSDateFormatter() formatter.dateFormat = "MMM-dd-yyyy" let todayDate = formatter.dateFromString(today)! let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! let myComponents = myCalendar.components(.Weekday, fromDate: todayDate) let daynumber = myComponents.weekday return daynumber }
La sortie sera comme ceci:
14 mars (lundi) 15 mars (mardi) 16 mars (mercredi) 17 mars (jeudi) 18 mars (vendredi) 19 mars (samedi) 20 mars (dimanche)
la source
Swift 3: fonction d'assistance Xcode 8:
func getDayOfWeek(fromDate date: Date) -> String? { let cal = Calendar(identifier: .gregorian) let dayOfWeek = cal.component(.weekday, from: date) switch dayOfWeek { case 1: return "Sunday" case 2: return "Monday" case 3: return "Tuesday" case 4: return "Wednesday" case 5: return "Thursday" case 6: return "Friday" case 7: return "Saturday" default: return nil } }
la source
Pour Swift4 pour obtenir le jour de la semaine à partir de la chaîne
func getDayOfWeek(today:String)->Int { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" let todayDate = formatter.date(from: today)! let myCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)! let myComponents = myCalendar.components(NSCalendar.Unit.weekday, from: todayDate) let weekDay = myComponents.weekday return weekDay! } let weekday = getDayOfWeek(today: "2018-10-10") print(weekday) // 4
la source