Stworzyłem metodę, która ma przyjmować ciąg znaków w postaci „RRRR-MM-DD” i wypluwać int, który reprezentuje pozycję dat w odniesieniu do tygodnia, w którym się ona znajduje (niezależnie od tego, czy nakłada się na miesiące). Na przykład niedziela = 1 poniedziałek = 2 i tak dalej.
Oto mój kod:
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
}
Wiem, że NSCalendarUnit.WeekdayOrdinalCalendar
to źle, ale próbowałem, myślę, że najbardziej logiczne kombinacje. A także bawić się myComponents.weekdayOrdinal
np. Używanymi mycomponents.day
lub .weekday
.
Oto moje opcje użycia:
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 }
Nie jest to dla mnie jasne, ponieważ nie ma opcji DayOfWeekUnit (lub czegoś podobnego).
swift
nsdate
nscalendar
boidkan
źródło
źródło
Odpowiedzi:
To, czego szukasz (jeśli dobrze rozumiem pytanie), to
NSCalendarUnit.CalendarUnitWeekday
. Odpowiednia właściwośćNSDateComponents
isweekday
.Zwróć również uwagę, że format daty jest nieprawidłowy (pełną specyfikację można znaleźć tutaj: http://unicode.org/reports/tr35/tr35-6.html ).
Funkcję można nieco uprościć, korzystając z automatycznego wnioskowania o typie, a także często używasz zmiennych, w których stałe są wystarczające. Ponadto funkcja powinna zwracać wartość opcjonalną, która dotyczy
nil
nieprawidłowego ciągu wejściowego.Zaktualizowany kod dla Swift 3 i nowszych:
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 }
Przykład:
if let weekday = getDayOfWeek("2014-08-27") { print(weekday) } else { print("bad input") }
Oryginalna odpowiedź na 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 } }
źródło
func getDayOfWeek(today:String)->Int?
. Jeśli wymusisz rozpakowanie opcjonalnego, nadal się zawiesza, prawda?if let ...
działa również z niejawnie rozpakowanymi opcjami.Swift 3 i 4
Pobieranie numeru dnia tygodnia jest znacznie uproszczone w języku Swift 3, ponieważ
DateComponents
nie jest już opcjonalne. Tutaj jest jako rozszerzenie: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
Jeśli szukałeś pisemnej, zlokalizowanej wersji dnia tygodnia:
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
źródło
Jeśli chcesz, aby pełne „niedziela”, „poniedziałek”, „wtorek”, „środa” itp.
EDYCJA: W rzeczywistości istnieje wbudowany format, który zwraca zlokalizowane nazwy dni:
extension NSDate { func dayOfTheWeek() -> String? { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "EEEE" return dateFormatter.stringFromDate(self) } }
Moje poprzednie rozwiązanie (tylko w języku angielskim):
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] } }
Nie musisz rozpakowywać kalendarza i komponentów, gwarantuje je szkielet podstawy.
Stosowanie:
print(myDate.dayOfTheWeek())
źródło
Prosta odpowiedź (szybka 3):
Calendar.current.component(.weekday, from: Date())
źródło
W moim przypadku szukałem ciągu trzech liter na każdy dzień. Zmodyfikowałem funkcję @Martin R w następujący sposób:
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 } }
źródło
dateFormat
Jest łatwiejszy sposób. Po prostu przekaż datę ciągu do następującej funkcji, poda Ci nazwę dnia :)
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); }
źródło
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) } }
użycie let weekday = Date (). weekdayName
źródło
Swift 3 Rozszerzenie daty
extension Date { var weekdayOrdinal: Int { return Calendar.current.component(.weekday, from: self) } }
źródło
Możesz użyć tej tabeli date_formats do konwersji daty na różne formaty. Mój najkrótszy kod:
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
źródło
SWIFT 5 - Dzień tygodnia
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"] } }
Przedłużenie daty na podstawie odpowiedzi Fattiego
źródło
Praktyczne rozwiązanie ...
Należy pamiętać, że wyniki to liczby całkowite od 1 do 7.
(Nie od zera do szóstej).
let trivialDayStringsORDINAL = ["", "SUN","MON","TUE","WED","THU","FRI","SAT"] // note that zero is not used
i wtedy ...
let dow = Calendar.current.component(.weekday, from: someDate) print( trivialDayStringsORDINAL[dow] )
źródło
Tutaj jest już wiele odpowiedzi, ale myślę, że jest inny, być może lepszy, sposób zrobienia tego przy użyciu odpowiednich
Calendar
interfejsów API.Sugerowałbym pobranie dnia tygodnia przy użyciu
weekdaySymbols
właściwościCalendar
( docs ) w rozszerzeniu doDate
: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] } }
Wymaga to inicjalizacji
Date
pierwszego, co zrobiłbym za pomocą niestandardowegoDateFormatter
: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 } }
Można to następnie wywołać za pomocą:
DateFormatter.standardDate.date(from: "2018-09-18")!.dayOfWeek
Dlaczego wolę to:
dayOfWeek
nie musi przejmować się strefami czasowymi, ponieważ używany jest kalendarz użytkownika, niektóre inne rozwiązania tutaj pokażą nieprawidłowy dzień, ponieważ strefy czasowe nie są brane pod uwagę.DateFormatter
i zamiast tego użyć go?weekdaySymbols
jest zlokalizowany dla Ciebie.weekDaySymbols
można zastąpić innymi opcjami, takimi jakshortWeekdaySymbols
„Pon”, „Wto” itp.Uwaga: w tym przykładzie
DateFormatter
nie uwzględniono również stref czasowych ani lokalizacji, musisz ustawić je zgodnie z potrzebami. Jeśli daty są zawsze dokładne, rozważ ustawienie strefy czasowejTimeZone(secondsFromGMT: 0)
.źródło
weekdaySymbols
, dziękiSkończyło się na tym, że potrzebowałem jeszcze kilku ciągów od daty, w tym daty tygodnia (np. „5”) i miesiąca roku (np. Sierpnia). Poniżej znajdują się wszystkie trzy funkcje, które utworzyłem na podstawie funkcji @Martin R i zmodyfikowałem tak, aby zwracały 3 ciągi znaków:
//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 } }
źródło
Kod SWIFT 2.0 prezentujący bieżący tydzień począwszy od poniedziałku.
@IBAction func show (sender: 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) }
źródło
Ten kod służy do wyszukania całego bieżącego tygodnia. Jest napisany w języku 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 }
Wynik będzie taki:
14 marca (poniedziałek) 15 marca (wtorek) 16 marca (środa) 17 marca (czwartek) 18 marca (piątek) 19 marca (sobota) 20 marca (niedziela)
źródło
Swift 3: Funkcja pomocnicza 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 } }
źródło
Aby Swift4 pobierał dzień tygodnia z ciągu znaków
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
źródło