NSDate를 사용하여 요일 가져 오기
나는 "YYYY-MM-DD"형식의 문자열을 취하고 그것이있는 주와 관련하여 날짜 위치를 나타내는 int를 뱉어내는 방법을 만들었습니다 (월간에 겹치는 지 여부에 관계없이). 예를 들어 sunday = 1 monday = 2 등등.
내 코드는 다음과 같습니다.
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
}
나는 그것이 NSCalendarUnit.WeekdayOrdinalCalendar
틀렸다는 것을 알고 있지만 대부분의 논리적 조합을 시도했습니다. 그리고 myComponents.weekdayOrdinal
예 를 들어 used mycomponents.day
또는 .weekday
.
사용할 항목에 대한 옵션은 다음과 같습니다.
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 }
DayOfWeekUnit 옵션 (또는 비슷한 것)이 없기 때문에 명확하지 않습니다.
당신이 찾고있는 것은 (질문을 올바르게 이해한다면)입니다 NSCalendarUnit.CalendarUnitWeekday
. 의 해당 속성은 NSDateComponents
입니다 weekday
.
또한 날짜 형식이 잘못되었습니다 (전체 사양은 http://unicode.org/reports/tr35/tr35-6.html 에서 찾을 수 있음 ).
함수는 자동 유형 추론을 사용하여 약간 단순화 할 수 있으며 상수가 충분한 변수를 많이 사용합니다. 또한 함수는 nil
유효하지 않은 입력 문자열에 대한 옵션을 반환해야 합니다.
Swift 3 이상에 대한 업데이트 된 코드 :
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
}
예:
if let weekday = getDayOfWeek("2014-08-27") {
print(weekday)
} else {
print("bad input")
}
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
}
}
스위프트 3 & 4
요일 검색 DateComponents
은 더 이상 선택 사항이 아니기 때문에 Swift 3에서 크게 단순화되었습니다 . 여기에 확장 기능이 있습니다.
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
요일의 서면으로 현지화 된 버전을 찾고 있다면 :
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
전체 "일요일", "월요일", "화요일", "수요일"등을 원하는 경우
편집 : 실제로 현지화 된 요일 이름을 반환하는 기본 형식이 있습니다.
extension NSDate {
func dayOfTheWeek() -> String? {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "EEEE"
return dateFormatter.stringFromDate(self)
}
}
내 이전 솔루션 (영어 전용) :
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]
}
}
달력과 구성 요소를 풀 필요가 없으며 기본 프레임 워크에 의해 보장됩니다.
용법:
print(myDate.dayOfTheWeek())
간단한 대답 (swift 3) :
Calendar.current.component(.weekday, from: Date())
더 쉬운 방법이 있습니다. 문자열 날짜를 다음 함수에 전달하면 요일 이름이 제공됩니다. :)
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);
}
제 경우에는 매일 세 글자의 문자열을 따랐습니다. @Martin R의 기능을 다음과 같이 수정했습니다.
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
}
}
Swift 3 Date 확장
extension Date {
var weekdayOrdinal: Int {
return Calendar.current.component(.weekday, from: self)
}
}
이 테이블 date_formats 를 사용 하여 날짜를 다른 형식으로 변환 할 수 있습니다. 내 가장 짧은 코드 :
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
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)
}
}
사용법 let weekday = Date (). weekdayName
실용적인 솔루션 ...
결과는 1에서 7까지의 정수입니다.
(0에서 6까지가 아닙니다.)
let trivialDayStringsORDINAL = ["", "SUN","MON","TUE","WED","THU","FRI","SAT"]
// note that zero is not used
그리고 ...
let dow = Calendar.current.component(.weekday, from: someDate)
print( trivialDayStringsORDINAL[dow] )
여기에는 이미 많은 답변이 있지만 올바른 Calendar
API를 사용하여이 작업을 수행하는 또 다른 방법이 있다고 생각합니다 .
다음 의 확장에서 ( docs ) weekdaySymbols
속성을 사용하여 요일을 얻는 것이 좋습니다 .Calendar
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]
}
}
이를 위해서는 Date
먼저 사용자 정의를 사용하여 초기화해야합니다 DateFormatter
.
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
}
}
그러면 다음과 같이 호출 할 수 있습니다.
DateFormatter.standardDate.date(from: "2018-09-18")!.dayOfWeek
내가 이것을 선호하는 이유 :
dayOfWeek
사용자의 달력이 사용되기 때문에 표준 시간대를 고려할 필요가 없습니다. 여기에있는 다른 솔루션 중 일부는 표준 시간대가 고려되지 않기 때문에 잘못된 날짜를 표시합니다.- 다른 장소에서 동일한 형식의 날짜를 사용해야 할 가능성이 매우 높으므로 재사용 가능한 파일을 만들어
DateFormatter
대신 사용하는 것이 어떻습니까? weekdaySymbols
현지화되어 있습니다.weekDaySymbols
shortWeekdaySymbols
"Mon", "Tues"등과 같은 다른 옵션으로 대체 할 수 있습니다 .
참고 : 이 예제 DateFormatter
는 또한 시간대 또는 로케일을 고려하지 않으므로 필요한 것에 맞게 설정해야합니다. 날짜가 항상 정확하다면 시간대 설정을 고려하세요 TimeZone(secondsFromGMT: 0)
.
요일 (예 : "5 일")과 그해의 월 (예 : 8 월)을 포함하여 날짜로부터 몇 개의 문자열이 더 필요하게되었습니다. 다음은 @Martin R의 함수를 기반으로 만들고 3 개의 문자 문자열을 반환하도록 수정 한 세 가지 함수입니다.
//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 2.0 코드.
@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)
}
이 코드는 이번 주 전체를 찾는 것입니다. 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
}
출력은 다음과 같습니다.
14March(Monday) 15March(Tuesday) 16March(Wednesday) 17March(Thursday) 18March(Friday) 19March(Saturday) 20March(Sunday)
Swift 3 : Xcode 8 helper function:
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
}
}
For Swift4 to get weekday from string
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
SWIFT 5 - Day of the week
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"]
}
}
Date extension based on Fattie's answer
참고URL : https://stackoverflow.com/questions/25533147/get-day-of-week-using-nsdate
'development' 카테고리의 다른 글
Vim에서 파일 찾기 (재귀 적 디렉토리 검색을 통해) (0) | 2020.10.23 |
---|---|
C ++의 문자열에서 파일 확장자를 얻는 방법 (0) | 2020.10.22 |
iOS 8 앱에서 상태 표시 줄 숨기기 (0) | 2020.10.22 |
가장 좋아하는 MATLAB / Octave 프로그래밍 트릭은 무엇입니까? (0) | 2020.10.22 |
DateTime.ToString ()을 사용할 때 요일 접미사 얻기 (0) | 2020.10.22 |