看过某书上面的做法是先生成一个公历的calendar,使用的是:

NSCalendar *cal = [NSCalendar currentCalendar];

然后用它生成一个NSDateComponent,最后再用一个中国农历的calendar将NSDateComponent转换为一个农历的NSDate。
实际执行后发现转换后的日期是错的。
下面是一个正确的转换方法,关键在于:先生成一个农历的calendar,然后再转换为公历的表示:

void show_local_date(NSDate *date){NSDateFormatter *f = [NSDateFormatter new];[f setDateFormat:@"Y-M-d HH:mm:ss z"];[f setTimeZone:[NSTimeZone timeZoneWithName:@"GMT+8"]];NSLog(@"%s:date is %@",__func__,[f stringFromDate:date]);
}int main(void){@autoreleasepool{NSLog(@"now is %@",[NSDate new]);NSCalendar *chinese_cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese];[chinese_cal setTimeZone:[NSTimeZone timeZoneWithName:@"GMT+8"]];unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay |\NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;NSDateComponents *comps = [chinese_cal components:unitFlags fromDate:[NSDate new]];NSCalendar *cal = [NSCalendar currentCalendar];NSDate *china_now = [cal dateFromComponents:comps];show_local_date(china_now);NSLog(@"%@",[Foo getChineseCalendarWithDate:[NSDate new]]);}return 0;
}

最后是其他人写的转换代码,和我的类似:

+(NSString*)getChineseCalendarWithDate:(NSDate *)date{NSArray *chineseYears = [NSArray arrayWithObjects:@"甲子", @"乙丑", @"丙寅", @"丁卯",  @"戊辰",  @"己巳",  @"庚午",  @"辛未",  @"壬申",  @"癸酉",@"甲戌",   @"乙亥",  @"丙子",  @"丁丑", @"戊寅",   @"己卯",  @"庚辰",  @"辛己",  @"壬午",  @"癸未",@"甲申",   @"乙酉",  @"丙戌",  @"丁亥",  @"戊子",  @"己丑",  @"庚寅",  @"辛卯",  @"壬辰",  @"癸巳",@"甲午",   @"乙未",  @"丙申",  @"丁酉",  @"戊戌",  @"己亥",  @"庚子",  @"辛丑",  @"壬寅",  @"癸丑",@"甲辰",   @"乙巳",  @"丙午",  @"丁未",  @"戊申",  @"己酉",  @"庚戌",  @"辛亥",  @"壬子",  @"癸丑",@"甲寅",   @"乙卯",  @"丙辰",  @"丁巳",  @"戊午",  @"己未",  @"庚申",  @"辛酉",  @"壬戌",  @"癸亥", nil];NSArray *chineseMonths=[NSArray arrayWithObjects:@"正月", @"二月", @"三月", @"四月", @"五月", @"六月", @"七月", @"八月", @"九月", @"十月", @"冬月", @"腊月", nil];NSArray *chineseDays=[NSArray arrayWithObjects:@"初一", @"初二", @"初三", @"初四", @"初五", @"初六", @"初七", @"初八", @"初九", @"初十", @"十一", @"十二", @"十三", @"十四", @"十五", @"十六", @"十七", @"十八", @"十九", @"二十",@"廿一", @"廿二", @"廿三", @"廿四", @"廿五", @"廿六", @"廿七", @"廿八", @"廿九", @"三十",  nil];NSCalendar *localeCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese];unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay |\NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;NSDateComponents *localeComp = [localeCalendar components:unitFlags fromDate:date];NSLog(@"%ld_%ld_%ld  %@",localeComp.year,localeComp.month,localeComp.day, localeComp.date);NSString *y_str = [chineseYears objectAtIndex:localeComp.year-1];NSString *m_str = [chineseMonths objectAtIndex:localeComp.month-1];NSString *d_str = [chineseDays objectAtIndex:localeComp.day-1];NSString *chineseCal_str =[NSString stringWithFormat: @"%@_%@_%@",y_str,m_str,d_str];//[localeCalendar release];return chineseCal_str;
}

Cocoa公历和中国农历直接的转换相关推荐

  1. js 根据公历日期 算出农历_根据公历日期计算农历年生肖及公历转换农历的方法...

    本帖最后由 wshcw 于 2011-12-6 23:23 编辑 有部分E友都知道,农历格式"[$-130000]e-m-d"转换出来的结果有好大一部分有误,那有没有其它转换办法呢 ...

  2. Java250 amp 249_中国公历算法amp;中国农历算法(JAVA)

    中国公历算法不是太难,关键是星期值的确定.这里给出了简单算法: public static int dayOfWeek(int y, int m, int d) { int w = 1; // 公历一 ...

  3. iOS Swift 将公历日期转换为中国农历

    将Date转换为中国农历 func convertDateToNongLi(aStrDate:Date)-> String{// MARK: - 农历格式数据let cDayName = [&q ...

  4. 让你的Excel完美支持中国农历

    3年多以前,曾有朋友在Excel的使用过程中遇到了问题,其实他的需求很简单,就是在Excel中将公历日期转换成农历,但用公式得到的转换结果不准确,而使用VBA代码实现虽然结果是正确的,然而每份文档都必 ...

  5. 中国农历的Java实现

    中国农历 支持公历范围为:1900-01-31到2099-12-31范围内,农历日期和公历日期的转换. 实现思路 通过记录1900年-2099年间的农历信息到二维数组中,经过查询和相关计算就能实现公历 ...

  6. winform显示中国农历

    using System; using System.Collections.Generic; using System.Text; namespace Carlendar { #region Chi ...

  7. 算法系列之二十:计算中国农历(二)

    (接上篇) 所谓的"天文算法",就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地 ...

  8. 写日历的程序员,你必须弄懂的中国农历算法。

    写日历的程序员,你必须弄懂的中国农历算法. NANSHAN即时通讯,我们知道农历通过置闰月的方式协调农历年和回归年长度不相等的问题,也知道了置闰的方法是"中气置闰"法,那么到底什么 ...

  9. ios - 农历公历互转 农历选择器

    通过UIpickerView实现date(农历)选择器(类似UIdatePicker),可以实现生日提醒等功能 1,需要导入 #import "solarOrLunar.h" #i ...

最新文章

  1. linux查询超线程,【转】Linux下判断一台机器是多少路,多少核,是否超线程的方法...
  2. 洛谷P4550 收集邮票(概率期望)
  3. C#--检索线程状态
  4. System类的常用方法
  5. java 无法找到ant_Java-Ant需要tools.jar并且无法找到我
  6. python字符串的内部函数_Python中字符串中内置函数
  7. 作者:牛怡晗,女,就职于上海浦东发展银行昆明分行。
  8. 一个类的java代码_求一段java代码,定义一个类
  9. php session 跨子域,PHP session 跨子域问题总结
  10. Android应用开发——系统自带样式Android:theme
  11. SimpleDateFormat的使用问题
  12. 数据处理利器python与scala基本数据结构对比分析1-大数据ML样本集案例实战
  13. 双 JK 触发器 74LS112 逻辑功能。真值表_C08. D触发器
  14. html报406错误,Ajax请求出现406的原因和解决方法
  15. Domain Driven Design(领域驱动设计)
  16. vm8网卡原理及应用
  17. 前端开发笔记:记一次网站创建的过程
  18. ics计算机基础,南大计算机系统基础实验 ics2020,pa0
  19. 解密Android7.0 8.0进程保活与拉活的实现方式 如何才能让APP常驻内存 躲避系统的追杀
  20. 地心坐标系转地理坐标系(NED)

热门文章

  1. win10 任务栏无法使用鼠标一直转圈圈解决方式
  2. 使用freemarker导出word文档包含多张图片
  3. Kmeans聚类K值选择Parametric Bootstrap方法,以及数据重抽样方法Bootstrapping
  4. 写给一个外汇女交易员的信(连载一)
  5. 仿京东、饿了么 左右联动菜单列表自定义View
  6. 7628刷breed_自制各类路由原厂直刷Breed的文件,无需修改mac无需重刷无线
  7. 3. Base64用途和原理
  8. 用python整个活(2)——用numpy做一个蜘蛛纸牌
  9. 求n位水仙花数(C语言实现)
  10. A Vertical Kelvin Test Structure for Measuring the True Specific Contact Resistivity