Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Objective-C中确定黄道十二宫_Ios_Objective C_Date - Fatal编程技术网

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
}