Ios 如何在Objective-C中确定黄道十二宫
我有以下代码:Ios 如何在Objective-C中确定黄道十二宫,ios,objective-c,date,Ios,Objective C,Date,我有以下代码: NSDate *myDate = [datePickerControl date]; NSDateFormatter *format = [[NSDateFormatter alloc]init]; [format setDateFormat:@"dd-MM"]; NSString *getDate = [format stringFromDate:myDate]; NSArray *array = [NSArray arrayWithObjects:@"15-06",@"1
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之间的所有日期
看一看屏幕截图
请给出一些代码,因为我是Objective-C的新手 您不需要为每个标志输入每个日期。相反,输入每个符号的开始和结束月份和日期的表格 然后取用户选择的日期,使用Gregorian NSCalendar从日期中提取月和日单位,然后将用户输入的日期与每个符号的范围进行比较
顺便说一句,这是天蝎座,不是蝎子。邓肯是对的,他回答问题时我正在给你写一个示例代码
//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;
}
下面是最简单的方法。是的,它很长,是的,它不是最有效的,但它肯定是最容易理解的,而且它已经为您编写。干杯: 另外,这是脱离热带黄道带的标准,与印度教系统的恒星黄道带相反,作为对Zev的回应,蛇夫座只影响每个星座对应的星座,但星座及其日期保持不变 代码如下:
-(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);
}
对于那些使用swift的人,我必须感谢Duncan C。他的解决方案对我帮助很大: 如果日期为dd/MM/yyyy
func getZodiacalSign(date:String) -> String {
let f = date.components(separatedBy: "/")
let day = Int(f[0])
let month = Int(f[1])
switch month {
case 1: return (day! >= 21) ? "Aquarius" : "Capricorn";
case 2: return (day! >= 20) ? "Picis" : "Aquarius";
case 3: return (day! >= 21) ? "Aries" : "Pisces";
case 4: return (day! >= 21) ? "Taurus" : "Aries";
case 5: return (day! >= 22) ? "Gemini" : "Taurus"
case 6: return (day! >= 22) ? "Cancer" : "Gemini";
case 7: return (day! >= 23) ? "Leo" : "Cancer";
case 8: return (day! >= 23) ? "Virgo" : "Leo";
case 9: return (day! >= 24) ? "Libra" : "Virgo";
case 10: return (day! >= 24) ? "Scorpio" : "Libra";
case 11: return (day! >= 23) ? "Sagittarius" : "Scorpio";
case 12: return (day! >= 22) ? "Capricorn" : "Sagittarius";
default: return ""
}
如何使用元组。。。迅捷的
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"
}
}
以下是使用Swift的人的答案。它基于Hendra Kusumah的元组解决方案,但使用扩展和枚举来获得更简洁、更快速的答案 用法 注意-如果希望字符串值大写或以其他方式显示不同,请使用date.zodiacSign.rawValue.capitalized操作字符串,或编辑zodiacSign枚举案例,例如案例aquarius=aquarius 延伸 枚举
这是前蛇夫座还是后蛇夫座;我在Zodiac不是很酷,但我必须执行客户的命令:打开月份似乎是一个不必要的复杂解决方案。此外,将日期构建为代码限制了灵活性——确定具有固定日期的热带黄道带可能没问题,但这种方法禁止添加日期在未来不固定的恒星黄道带。最好将日期存储在某种类型的表中——可能是一个属性列表或JSON文件,其中包含一组字典,每个字典都包含相应的符号和日期范围。
let date = Date()
date.zodiacSign // Enum value e.g. .aquarius
date.zodiacSign.rawValue // String value e.g. "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
}