我有以下代码:
NSDate *myDate = [datePickerControl date];
NSDateFormatter *format = [[NSDateFormatter alloc]init];
[format setDateFormat:@"dd-MM"];
NSString *getDate = [format stringFromDate:myDate];
NSArray *array = [NSArray arrayWithObjects:@"15-06",@"15-07",@"15-08",nil];
for (int i = 0; i < ([array count]); i++) {
NSLog(@"i = %i", i);
NSString *stringToCheck = (NSString *)[array objectAtIndex:i];
if ([getDate isEqualToString:stringToCheck]) {
[signWow setText:[NSString stringWithFormat:@"Your sign is Scorpion"]];
}}
使用日期选择器确定出生日期,然后将日期与NSArray中的日期进行比较。但是,输入与特定十二生肖相关的所有日期太难了。 那么,是否可以制作一个包含例如02/12( dd / MM )和03/15之间所有日期的数组?
查看屏幕截图here。
请提供一些代码,因为我是Objective-C的新手......:)
答案 0 :(得分:2)
您不需要为每个标志输入每个日期。相反,请输入每个标志的开始和结束月份和日期的表格。
然后,您将获取用户选择的日期,使用Gregorian NSCalendar从日期中提取月份和日期单位,然后将用户输入的日期与每个符号的范围进行比较。
顺便说一下,它是“天蝎座”,而不是“蝎子”。答案 1 :(得分:1)
这是最简单的方法。是的,它很长,是的,它不是最有效的,但它绝对是最容易理解的,而且它已经为你写了。干杯:)
P.S。这是热带十二生肖(标准,而不是基于印度教系统的恒星生肖),并且为了回应Zev,蛇夫座只影响了每个星座相应的星座,但是s及其日期不受影响。
以下是代码:
-(void)getZodiacFromBirthday {
NSString *UserBirthday = @"09/09/99";
NSArray *birthArray = [UserBirthday componentsSeparatedByString:@"/"];
NSString *month = birthArray[0];
NSString *day = birthArray[1];
if ([month isEqualToString:@"01"]) {
if ([day intValue] >= 21) {
sign = @"Aquarius";
} else {
sign = @"Capricorn";
}
} else if ([month isEqualToString:@"02"]) {
if ([day intValue] >= 20) {
sign = @"Pisces";
} else {
sign = @"Aquarius";
}
} else if ([month isEqualToString:@"03"]) {
if ([day intValue] >= 21) {
sign = @"Aries";
} else {
sign = @"Pisces";
}
} else if ([month isEqualToString:@"04"]) {
if ([day intValue] >= 21) {
sign = @"Taurus";
} else {
sign = @"Aries";
}
} else if ([month isEqualToString:@"05"]) {
if ([day intValue] >= 22) {
sign = @"Gemini";
} else {
sign = @"Taurus";
}
} else if ([month isEqualToString:@"06"]) {
if ([day intValue] >= 22) {
sign = @"Cancer";
} else {
sign = @"Gemini";
}
} else if ([month isEqualToString:@"07"]) {
if ([day intValue] >= 23) {
sign = @"Leo";
} else {
sign = @"Cancer";
}
} else if ([month isEqualToString:@"08"]) {
if ([day intValue] >= 23) {
sign = @"Virgo";
} else {
sign = @"Leo";
}
} else if ([month isEqualToString:@"09"]) {
if ([day intValue] >= 24) {
sign = @"Libra";
} else {
sign = @"Virgo";
}
} else if ([month isEqualToString:@"10"]) {
if ([day intValue] >= 24) {
sign = @"Scorpio";
} else {
sign = @"Libra";
}
} else if ([month isEqualToString:@"11"]) {
if ([day intValue] >= 23) {
sign = @"Sagittarius";
} else {
sign = @"Scorpio";
}
} else if ([month isEqualToString:@"12"]) {
if ([day intValue] >= 22) {
sign = @"Capricorn";
} else {
sign = @"Sagittarius";
}
}
NSLog(@"Sign: %@", sign);
}
答案 2 :(得分:1)
如何使用元组...(斯威夫特)
func getZodiacSign(_ date:Date) -> String{
let calendar = Calendar.current
let d = calendar.component(.day, from: date)
let m = calendar.component(.month, from: date)
switch (d,m) {
case (21...31,1),(1...19,2):
return "aquarius"
case (20...29,2),(1...20,3):
return "pisces"
case (21...31,3),(1...20,4):
return "aries"
case (21...30,4),(1...21,5):
return "taurus"
case (22...31,5),(1...21,6):
return "gemini"
case (22...30,6),(1...22,7):
return "cancer"
case (23...31,7),(1...22,8):
return "leo"
case (23...31,8),(1...23,9):
return "virgo"
case (24...30,9),(1...23,10):
return "libra"
case (24...31,10),(1...22,11):
return "scorpio"
case (23...30,11),(1...21,12):
return "sagittarius"
default:
return "capricorn"
}
}
答案 3 :(得分:0)
Duncan是对的,当他回答问题时,我正在给你写一个示例代码......
//get date from your picker
NSDate *myDate = [datePickerControl date];
NSCalendar *gregorianCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComps = [gregorianCal components: (NSDayCalendarUnit | NSMonthCalendarUnit)
fromDate: myDate];
// Then use it
int month=[dateComps month];
int days=[dateComps day];
//I guess there is only two zodiac signs possilble for each month right?
switch (month)
{
case 1:
//compare the dates
if (days<=20)
{
//user is Capricorn
}
else
{
//user is Picses
}
break;
case 2:
break;
//you will have 12 cases and each case will have an if else with corect dates.....
default;
break;
}
答案 4 :(得分:0)
对于那些使用swift的人,我必须感谢Duncan C.他的解决方案给了我很多帮助:
如果日期是“dd / MM / yyyy”
func getSignoZodiacal(date:String) -> String {
let f = date.componentsSeparatedByString("/")
let dia = Int(f[0])
let mes = Int(f[1])
if mes == 1 {
if dia >= 21 {
return "Aquarius"
}else {
return "Capricorn"
}
}else if mes == 2 {
if dia >= 20 {
return "Picis"
}else {
return "Aquarius"
}
}else if mes == 3 {
if dia >= 21 {
return "Aries"
}else {
return "Pisces"
}
}else if mes == 4 {
if dia >= 21 {
return "Taurus"
}else {
return "Aries"
}
}else if mes == 5 {
if dia >= 22 {
return "Gemini"
}else {
return "Taurus"
}
}else if mes == 6 {
if dia >= 22 {
return "Cancer"
}else {
return "Gemini"
}
}else if mes == 7 {
if dia >= 23 {
return "Leo"
}else {
return "Cancer"
}
}else if mes == 8 {
if dia >= 23 {
return "Virgo"
}else {
return "Leo"
}
}else if mes == 9 {
if dia >= 24 {
return "Libra"
}else {
return "Virgo"
}
}else if mes == 10 {
if dia >= 24 {
return "Scorpio"
}else {
return "Libra"
}
}else if mes == 11 {
if dia >= 23 {
return "Sagittarius"
}else {
return "Scorpio"
}
}else if mes == 12 {
if dia >= 22 {
return "Capricorn"
}else {
return "Sagittarius"
}
}
return ""
}
答案 5 :(得分:0)
以下是使用Swift的用户的答案。它基于Hendra Kusumah的元组解决方案,但使用扩展名和枚举来获得更整洁,更像Swift的答案。
用法
let date = Date()
date.zodiacSign // Enum value e.g. .aquarius
date.zodiacSign.rawValue // String value e.g. "aquarius"
注意-如果您希望字符串值大写或以其他方式出现,请使用date.zodiacSign.rawValue.capitalized
操纵字符串或编辑ZodiacSign
枚举大小写,例如case aquarius = "Aquarius"
扩展
extension Date {
var zodiacSign: ZodiacSign {
get {
let calendar = Calendar.current
let day = calendar.component(.day, from: self)
let month = calendar.component(.month, from: self)
switch (day, month) {
case (21...31, 1), (1...19, 2):
return .aquarius
case (20...29, 2), (1...20, 3):
return .pisces
case (21...31, 3), (1...20, 4):
return .aries
case (21...30, 4), (1...21, 5):
return .taurus
case (22...31, 5), (1...21, 6):
return .gemini
case (22...30, 6), (1...22, 7):
return .cancer
case (23...31, 7), (1...22, 8):
return .leo
case (23...31, 8), (1...23, 9):
return .virgo
case (24...30, 9), (1...23, 10):
return .libra
case (24...31, 10), (1...22, 11):
return .scorpio
case (23...30, 11), (1...21, 12):
return .sagittarius
default:
return .capricorn
}
}
}
}
枚举
enum ZodiacSign: String {
case aries
case taurus
case gemini
case cancer
case leo
case virgo
case libra
case scorpio
case sagittarius
case capricorn
case aquarius
case pisces
}