【问题标题】:Setting week day of NSDate will not change the date?设置 NSDate 的星期几不会改变日期吗?
【发布时间】:2015-04-13 16:59:20
【问题描述】:

我想在某个日期将其工作日更改为另一天,同时用户执行一些操作。 当我将工作日更改为另一天/天时,结果 NSDate 保持在当月的同一天,所以如果我将 dayweek 设置为 5,13.4.15 将保持不变。

 NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponents = [calendar components:(NSCalendarUnitWeekday|NSCalendarUnitSecond|NSCalendarUnitMonth|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitYear|NSCalendarUnitDay) fromDate:lastdate];
    [dateComponents setWeekday:currentDay]; //set it to numbers from 0 to 7
    NSDate *date = [calendar dateFromComponents:dateComponents];
    lastdate=date;

    NSLog(@"%@",lastdate); //stay the same date of the month although i change the week day .

编辑: 从组件中删除日单位,不会解决问题,但会为新日期创建错误的月份日期:

NSLog(@"%@",lastdate);//gives 14.4.15

//change last date day to the new day
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *dateComponents = [calendar components:(NSCalendarUnitWeekday|NSCalendarUnitSecond|NSCalendarUnitMonth|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitYear ) fromDate:lastdate];
[dateComponents setWeekday:currentDay];//added one day
NSDate *date = [calendar dateFromComponents:dateComponents];
lastdate=date;

NSLog(@"%@",lastdate); //gives 1.4.15

【问题讨论】:

  • 你的权利,它将日期重置为月初。
  • 那么您将如何更改工作日以更改整个日期?

标签: ios objective-c


【解决方案1】:

尝试在组件解析中添加 NSCalendarUnitWeekOfMonth 标志。我假设日期组件不知道应该设置哪一周,因此工作日将被忽略。

NSDateComponents *dateComponents = [calendar components:(NSCalendarUnitSecond|NSCalendarUnitWeekOfMonth |NSCalendarUnitMonth|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitYear) fromDate:lastdate];

【讨论】:

    【解决方案2】:

    我已经设法通过 3 个步骤做到这一点,获取当前日期,获取其月份中的某天,然后计算要添加的天数,然后将它们添加到新日期:

    //get new date with the new month day
    NSDate *newdate=[[NSDate date] dateByAddingTimeInterval:60*60*24* (currentDay-today) ]; //current day is the day the user chosen . today, is day of today .
    
    //extract the new month day
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponents = [calendar components:(NSCalendarUnitWeekday|NSCalendarUnitSecond|NSCalendarUnitMonth|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitYear|NSCalendarUnitDay ) fromDate:newdate];
    long newDayOfMonth=[dateComponents day];
    
    
    //create components from nob date
     NSDateComponents *nobComponents = [calendar components:(NSCalendarUnitWeekday|NSCalendarUnitSecond|NSCalendarUnitMonth|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitYear|NSCalendarUnitDay ) fromDate:lastdate];
    [nobComponents setDay:newDayOfMonth];
     NSDate *date = [calendar dateFromComponents:dateComponents];
    lastdate=date;
    
    
    
    
    NSLog(@"final date:%@",lastdate);
    

    【讨论】:

      【解决方案3】:

      我不确定这是否适合您的用例,但此答案显示了如何在给定的工作日创建一个新的 NSDate 实例:https://stackoverflow.com/a/31740820/849180

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        • 2017-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        相关资源
        最近更新 更多