NSCalendar currentCalendar无法正常工作

时间:2016-11-15 07:00:00

标签: ios objective-c calendar

在我的项目中。我想在我的项目中更改用户日历。如果用户选择日语日历,则日期在我的项目中以日历格式显示。如果用户选择Gregorian,则日期显示为Gregorian Calendar格式。所以我使用了如下的类文件。

这是 myclass.h

#import <Foundation/Foundation.h>

@interface util : NSObject

+ (NSString *)getTrimedString:(NSString *)str;

+(NSDate*)convertStringToDate:(NSString*)baseString;
+(NSString*)dateToYMD:(NSDate*)date;
+(NSString*)dateToMDHM:(NSDate*)date;
+(NSString*)dateToYMDHM:(NSDate*)date;

+(NSString*)dateToHM:(NSDate*)date;
+(NSString*)convertStringToMDHM:(NSString*)baseString;

+(UILabel*)createWorkLblWord:(NSString*)baseText;
+(UILabel*)createWorkLblWord:(NSString*)baseText widths:(NSInteger)width fontSize:(NSInteger)size;

+(float)systemVersionFloat;

@end


+(NSString*)dateToYMDHM:(NSDate*)date{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

这是 myclass.m

#import "util.h"

@implementation util

+(NSString*)dateToYMDHM:(NSDate*)date{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];



NSCalendar *usercalendar = [NSCalendar currentCalendar];

[formatter setCalendar:usercalendar];

NSLog(@"Current Auto Calendar : %@",[[NSCalendar autoupdatingCurrentCalendar] calendarIdentifier]);
NSLog(@"current calendar: %@", [[NSCalendar currentCalendar] calendarIdentifier]);

[formatter setDateFormat:@"yyyy/MM/dd\nH:mm"];
    return [formatter stringFromDate:date];
}

但结果只显示格里高利历日历格式。即使用户选择日历或佛教日历,我的项目也只显示格里高利历日历格式日期。我该如何解决这个问题?

Here is NSLog Screenshot

3 个答案:

答案 0 :(得分:1)

我的问题的解决答案不是编码错误。它在Scheme Options中错了。我在Xcode产品菜单中将我的应用程序区域更改为系统区域&gt;&gt;方案&gt;&gt;编辑方案&gt;&gt;选项标签。 Mr.Andrew Romanov救了我。非常感谢Mr.Andrw Romanov

这是我的方案选项截图。

enter image description here

答案 1 :(得分:0)

而不是使用[NSCalendar currentCalendar]尝试使用标识符,当前日历选择默认值

为格里高利安 [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];

佛教徒 `[[NSCalendar alloc] initWithCalendarIdentifier:NSBuddhistCalendar];

答案 2 :(得分:0)

currentCalendar它是当前区域设置的日历,用户可以在手机的设置中进行更改。
如果要允许用户更改应用程序中的日历。您应该使用calendarWithIdentifier方法创建所需的日历 您还可以订阅NSCurrentLocaleDidChangeNotification,并更新用户界面。

此处的所有代码:

@interface ViewController ()

- (IBAction)printCurrentCalendar:(id)sender;
- (void)localeChangedNotification:(NSNotification*)notification;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(localeChangedNotification:) name:NSCurrentLocaleDidChangeNotification object:nil];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


#pragma mark Actions
- (IBAction)printCurrentCalendar:(id)sender
{
    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSLog(@"calendar from currentCalendar: %@", calendar.calendarIdentifier);

    NSCalendar* localeCalendar = [NSCalendar calendarWithIdentifier:[NSLocale currentLocale].calendarIdentifier];
    NSLog(@"calendar from locale: %@",  localeCalendar.calendarIdentifier);
}


- (void)localeChangedNotification:(NSNotification*)notification
{
    NSLog(@"locale changed");
}

@end

输出:

  

CalendarCheck [1289:74644]来自currentCalendar的日历:格里高利   CalendarCheck [1289:74644]来自语言环境的日历:gregorian
  CalendarCheck [1289:74644]区域设置已更改
  CalendarCheck [1289:74644]来自currentCalendar的日历:japanese   CalendarCheck [1289:74644]来自locale的日历:japanese