【问题标题】:How to determine the localized first day of month?如何确定本地化月份的第一天?
【发布时间】:2015-07-16 17:18:09
【问题描述】:

我必须找到每个月 1 日所在的 才能创建自定义日历;例如,2015 年 9 月 1 日是星期二,这使得星期二成为该月的第一天。

我有这个代码适用于英语国家,但对于其他国家,它失败了,因为它没有正确翻译。

    //  build date as start of month
monthDateComponents.year = components.year;
monthDateComponents.month = components.month;
monthDateComponents.day = 1;

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *builtDate =[gregorian dateFromComponents: monthDateComponents];

NSDateFormatter *df = [NSDateFormatter new];
[df setDateFormat:@"E"];    
NSString *firstDay = [df stringFromDate:builtDate];

//  now, convert firstDay to the numeric day number
if([firstDay isEqual:NSLocalizedString(@"Sun",nil)])
    return 7;
else if([firstDay isEqual:NSLocalizedString(@"Mon",nil)])
    return 1;
else if([firstDay isEqual:NSLocalizedString(@"Tue",nil)])
    return 2;
else if([firstDay isEqual:NSLocalizedString(@"Wed",nil)])
    return 3;
else if([firstDay isEqual:NSLocalizedString(@"Thu",nil)])
    return 4;
else if([firstDay isEqual:NSLocalizedString(@"Fri",nil)])
    return 5;
else if([firstDay isEqual:NSLocalizedString(@"Sat",nil)])
    return 6;

有没有更好的方法来做到这一点,这样我就不必遍历每个国家并找到每天的 3 个字符缩写是什么? (例如,在法语中,星期六的缩写返回“sam”。)按照我现在的编码方式,我需要了解我的应用程序本地化的每种语言(其中 10 种)才能使其正常工作.

提前谢谢你。

【问题讨论】:

  • 这段代码,以及你产生的问题,没有意义。你想得到什么结果?如果它是本地化字符串,您已经从NSDateFormatter 获得它。如果是工作日数字,那么您根本不应该涉及格式化程序:在构造初始日期后从日历中获取该日期组件。
  • 嗨乔希...我没有看到任何日期组件可以给我当月的第一天;工作日组件只会给我过去日期的天数。我需要获取每个月第一天的天数来构建日历。正如我所指出的,它适用于英语国家,但没有本地化。
  • 构建日期后,使用日期组件和日历,您可以从日历中获取该日期的任何日期组件。如果你想要那个日期的工作日部分,你可以得到它。
  • 我得到了它的工作......再次感谢乔希......我很感激......

标签: objective-c ios8 nsdateformatter nscalendar nslocalizedstring


【解决方案1】:

试试这个,它使用 NSCalendar 的智能日历计算。

  NSDateComponents *components = [NSDateComponents new];
  components.day = 1;
  NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

  NSDate *firstDayOfMonth = [gregorian nextDateAfterDate:builtDate matchingComponents:components options: NSCalendarMatchNextTime | NSCalendarSearchBackwards];
  NSInteger weekdayIndex = [gregorian component:NSCalendarUnitWeekday fromDate:firstDayOfMonth];
  NSLog(@"weekday number: %ld", weekdayIndex);
  return weekdayIndex;

【讨论】:

  • 这并不能解决当天的本地化缩写问题,然后必须将其转换为天数。
  • 我编辑了帖子以返回工作日索引,在这种情况下本地化无关紧要。正如另一个答案中提到的,在公历索引中 1 是星期日
  • 我修改了您使用 weekdayIndex 显示的内容,它有效...谢谢。
【解决方案2】:

你想要这个:

return [gregorian component:NSCalendarUnitWeekday fromDate:builtDate];

这会为您提供一个整数,告诉您该日期的工作日。 1 是星期日。

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 2022-01-04
    • 2014-11-21
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多