swift - Obtenga el día de la semana usando NSDate
nscalendar (15)
Creé un método que se supone que toma una cadena en forma de "YYYY-MM-DD" y escupe un int que representa la posición de las fechas en relación con la semana en la que se encuentra (independientemente de si se superpone entre meses). Entonces, por ejemplo, domingo = 1 lunes = 2 y así sucesivamente.
Aquí está mi código:
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
}
Sé que NSCalendarUnit.WeekdayOrdinalCalendar
está mal, pero lo he intentado, creo que la mayoría de las combinaciones lógicas. Y también se ha metido con myComponents.weekdayOrdinal
por ejemplo, usa mycomponents.day
o .weekday
.
Estas son mis opciones sobre qué usar:
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 }
No es claro para mí ya que no hay una opción DayOfWeekUnit (o algo similar).
Swift 3 y 4
Recuperar el día de la semana se simplifica radicalmente en Swift 3 porque DateComponents
ya no es opcional. Aquí está como una extensión:
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 estabas buscando la versión escrita y localizada del día de la semana:
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
Código SWIFT 2.0 para presentar la semana actual a partir del lunes.
@IBAction func show (remitente: 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)
}
En mi caso, buscaba una cadena de tres letras para cada día. Modifiqué la función de @Martin R de la siguiente manera:
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
}
}
Este código es para encontrar toda la semana actual. Está escrito 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 salida será así:
14 de marzo (lunes) 15 de marzo (martes) 16 de marzo (miércoles) 17 de marzo (jueves) 18 de marzo (viernes) 19 de marzo (sábado) 20 de marzo (domingo)
Función auxiliar de Swift 3: 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
}
}
Hay una manera más fácil. Simplemente pase su fecha de cadena a la siguiente función, le dará el nombre del día :)
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 respuesta simple (swift 3):
Calendar.current.component(.weekday, from: Date())
La solución práctica ...
Tenga en cuenta que los resultados son los números uno al siete.
(No cero a seis)
let trivialDayStringsORDINAL = ["", "SUN","MON","TUE","WED","THU","FRI","SAT"]
// note that zero is not used
y entonces ...
let dow = Calendar.current.component(.weekday, from: someDate)
print( trivialDayStringsORDINAL[dow] )
Lo que está buscando (si entiendo la pregunta correctamente) es NSCalendarUnit.CalendarUnitWeekday
. La propiedad correspondiente de NSDateComponents
es de weekday
.
Tenga en cuenta también que su formato de fecha es incorrecto (la especificación completa se puede encontrar aquí: http://unicode.org/reports/tr35/tr35-6.html ).
La función se puede simplificar ligeramente, usando la inferencia de tipo automática, también se usan muchas variables donde las constantes son suficientes. Además, la función debería devolver una opción que es nil
para una cadena de entrada no válida.
Código actualizado para Swift 3 y posterior:
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
}
Ejemplo:
if let weekday = getDayOfWeek("2014-08-27") {
print(weekday)
} else {
print("bad input")
}
Respuesta original para 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
}
}
Puede usar esta tabla date_formats para convertir su fecha a diferentes formatos. Mi código más corto:
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
Si quiere el "miércoles" completo, "domingo", etc.
EDITAR: En realidad, hay un formato integrado que devuelve nombres de días localizados:
extension NSDate {
func dayOfTheWeek() -> String? {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "EEEE"
return dateFormatter.stringFromDate(self)
}
}
Mi solución anterior (solo para inglés):
extension NSDate {
func dayOfTheWeek() -> String? {
let weekdays = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Satudrday,"
]
let calendar: NSCalendar = NSCalendar.currentCalendar()
let components: NSDateComponents = calendar.components(.Weekday, fromDate: self)
return weekdays[components.weekday - 1]
}
}
No necesita desenvolver el calendario y los componentes, están garantizados por el marco básico.
Uso:
print(myDate.dayOfTheWeek())
Terminé necesitando algunas cuerdas más a partir de la fecha, incluida la fecha de la semana (por ejemplo, "5ta") y el mes del año (por ejemplo, agosto). A continuación están las tres funciones que he creado basadas en la función de @Martin R y modificadas para devolver 3 cadenas de caracteres:
//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
}
}
Swift 3 Extensión de fecha
extension Date {
var weekdayOrdinal: Int {
return Calendar.current.component(.weekday, from: self)
}
}
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 dateOnly: String {
let formatter = DateFormatter(); formatter.dateFormat = DATE_FORMAT
return formatter.string(from: self as Date)
}
var fullDate: String {
let formatter = DateFormatter(); formatter.dateFormat = DATE_FORMAT
return formatter.string(from: self as Date)
}
var DatewithMonth: String {
let formatter = DateFormatter(); formatter.dateStyle = .medium ; return formatter.string(from: self as Date)
}
}
use let weekday = Date (). weekdayName
func getDayOfWeek(today:String)->Int {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let todayDate = formatter.dateFromString(today)!
let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let myComponents = myCalendar.components(NSCalendarUnit.Weekday, fromDate: todayDate)
let weekDay = myComponents.weekday
return weekDay
}
let weekday = getDayOfWeek("2014-08-27")
print(weekday) // 4