HTML5技术

【无私分享】干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~ - 南尘(2)

字号+ 作者:H5之家 来源:H5之家 2016-08-12 12:00 我要评论( )

1 package com.example.nanchen.mydateviewdemo.view; java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Calendar; 6 import java.util.Date; nanchen 10 * @date 16-8-10 上午

1 package com.example.nanchen.mydateviewdemo.view; java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Calendar; 6 import java.util.Date; nanchen 10 * @date 16-8-10 上午11:36 CalendarUtil { * 用于保存中文的月份 String CHINESE_NUMBER[] = { "一", "二", "三", "四", "五", 17 "六", "七", "八", "九", "十", "十一", "腊" }; * 用于保存展示周几使用 String WEEK_NUMBER[] = { "日", "一", "二", "三", "四", "五", 23 "六" }; [] LUNAR_INFO = new long[] { 0x04bd8, 0x04ae0, 26 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 27 0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 28 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 29 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 30 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 31 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 32 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 33 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 34 0x0e950, 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 35 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 36 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 37 0x195a6, 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 38 0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 39 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 40 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 41 0x025d0, 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 42 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 43 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 44 0x0ea65, 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 45 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 46 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 47 0x0ada0 }; * 转换为2012年11月22日格式 SimpleDateFormat chineseDateFormat = new SimpleDateFormat( 53 "yyyy年MM月dd日"); * 转换为2012-11-22格式 SimpleDateFormat simpleDateFormat = new SimpleDateFormat( 58 "yyyy-MM-dd"); * 计算得到农历的年份 mLuchYear; * 计算得到农历的月份 mLuchMonth; * 计算得到农历的日期 mLuchDay; * 用于标识是事为闰年 isLoap; * 用于记录当前处理的时间 Calendar mCurrenCalendar; * 传回农历 year年的总天数 86 * year 88 * 将要计算的年份 返回传入年份的总天数 yearDays(int year) { 92 int i, sum = 348; 93 for (i = 0x8000; i > 0x8; i >>= 1) { 94 if ((LUNAR_INFO[year - 1900] & i) != 0) 95 sum += 1; 96 } 97 return (sum + leapDays(year)); 98 } * 传回农历 year年闰月的天数 102 * year 104 * 将要计算的年份 返回 农历 year年闰月的天数 leapDays(int year) { 108 if (leapMonth(year) != 0) { 109 if ((LUNAR_INFO[year - 1900] & 0x10000) != 0) 110 return 30; 29; 0; 115 } * 传回农历 year年闰哪个月 1-12 , 没闰传回 0 119 * year 121 * 将要计算的年份 传回农历 year年闰哪个月 1-12 , 没闰传回 0 leapMonth(int year) { 125 return (int) (LUNAR_INFO[year - 1900] & 0xf); 126 } * 传回农历 year年month月的总天数 130 * year 132 * 将要计算的年份 month 134 * 将要计算的月份 传回农历 year年month月的总天数 monthDays(int year, int month) { 138 if ((LUNAR_INFO[year - 1900] & (0x10000 >> month)) == 0) 139 return 29; 30; 142 } * 传回农历 y年的生肖 146 * 传回农历 y年的生肖 String animalsYear() { 150 final String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇", 151 "马", "羊", "猴", "鸡", "狗", "猪" }; 152 return Animals[(mLuchYear - 4) % 12]; 153 } String cyclicalm(int num) { 157 final String[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚", 158 "辛", "壬", "癸" }; 159 final String[] Zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳", "午", 160 "未", "申", "酉", "戌", "亥" }; (Gan[num % 10] + Zhi[num % 12]); 163 } String cyclical() { 167 int num = mLuchYear - 1900 + 36; 168 return (cyclicalm(num)); 169 } * 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数 173 * dayCyl5:与1900年1月31日相差的天数,再加40 ? 174 * cal CalendarUtil(Calendar cal) { 179 mCurrenCalendar = cal; 180 int leapMonth = 0; 181 Date baseDate = null; 182 try { 183 baseDate = chineseDateFormat.parse("1900年1月31日"); 184 } catch (ParseException e) { 185 e.printStackTrace(); // To change body of catch statement use } offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L); 191 // 用offset减去每农历年的天数 192 // 计算当天是农历第几天 193 // i最终结果是农历的年份 iYear, daysOfYear = 0; 196 for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) { 197 daysOfYear = yearDays(iYear); 198 offset -= daysOfYear; 199 } 200 if (offset < 0) { 201 offset += daysOfYear; 202 iYear--; 203 } mLuchYear = iYear; isLoap = false; iMonth, daysOfMonth = 0; 212 for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) { (leapMonth > 0 && iMonth == (leapMonth + 1) && !isLoap) { 215 --iMonth; 216 isLoap = true; 217 daysOfMonth = leapDays(mLuchYear); 218 } else 219 daysOfMonth = monthDays(mLuchYear, iMonth); 220 221 offset -= daysOfMonth; (isLoap && iMonth == (leapMonth + 1)) 224 isLoap = false; 225 if (!isLoap) { 226 } 227 } (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) { 230 if (isLoap) { 231 isLoap = false; 232 } else { 233 isLoap = true; 234 --iMonth; 235 } 236 } (offset < 0) { 239 offset += daysOfMonth; 240 --iMonth; 241 242 } 243 mLuchMonth = iMonth; 244 mLuchDay = offset + 1; 245 } * 返化成中文格式 249 * day String getChinaDayString(int day) { 254 String chineseTen[] = { "初", "十", "廿", "卅" }; 255 int n = day % 10 == 0 ? 9 : day % 10 - 1; 256 if (day > 30) 257 return ""; 258 if (day == 10) 259 return "初十"; chineseTen[day / 10] + CHINESE_NUMBER[n]; 262 } * 用于显示农历的初几这种格式 266 * 农历的日期 String toString() { 270 String message = ""; message = getChinaCalendarMsg(mLuchYear, mLuchMonth, mLuchDay); 273 if (StringUtil.isNullOrEmpty(message)) { 274 String solarMsg = new SolarTermsUtil(mCurrenCalendar) 275 .getSolartermsMsg(); (!StringUtil.isNullOrEmpty(solarMsg)) { 278 message = solarMsg; 279 } else { * 判断当前日期是否为公历节日 String gremessage = new GregorianUtil(mCurrenCalendar) 284 .getGremessage(); 285 if (!StringUtil.isNullOrEmpty(gremessage)) { 286 message = gremessage; 287 } else if (mLuchDay == 1) { 288 message = CHINESE_NUMBER[mLuchMonth - 1] + "月"; 289 } else { 290 message = getChinaDayString(mLuchDay); 291 } 292 293 } 294 } 295 return message; 296 } * 返回农历的年月日 300 * 农历的年月日格式 String getDay() { 304 return (isLoap ? "闰" : "") + CHINESE_NUMBER[mLuchMonth - 1] + "月" 305 + getChinaDayString(mLuchDay); 306 } * 把calendar转化为当前年月日 310 * calendar 312 * Calendar 返回成转换好的 年月日格式 String getDay(Calendar calendar) { 316 return simpleDateFormat.format(calendar.getTime()); 317 } * 用于比对二个日期的大小 321 * compareDate 323 * 将要比对的时间 currentDate 325 * 当前时间 true 表示大于当前时间 false 表示小于当前时间 compare(Date compareDate, Date currentDate) { 329 return chineseDateFormat.format(compareDate).compareTo( 330 chineseDateFormat.format(currentDate)) >= 0; 331 } * 获取当前周几 335 * calendar String getWeek(Calendar calendar) { 340 return "周" + WEEK_NUMBER[calendar.get(Calendar.DAY_OF_WEEK) - 1] + ""; 341 } * 将当前时间转换成要展示的形式 345 * calendar String getCurrentDay(Calendar calendar) { 350 return getDay(calendar) + " 农历" + new CalendarUtil(calendar).getDay() 351 + " " + getWeek(calendar); 352 } * 用于获取中国的传统节日 356 * month 358 * 农历的月 day 360 * 农历日 中国传统节日 String getChinaCalendarMsg(int year, int month, int day) { 364 String message = ""; 365 if (((month) == 1) && day == 1) { 366 message = "春节"; 367 } else if (((month) == 1) && day == 15) { 368 message = "元宵"; 369 } else if (((month) == 5) && day == 5) { 370 message = "端午"; 371 } else if ((month == 7) && day == 7) { 372 message = "七夕"; 373 } else if (((month) == 8) && day == 15) { 374 message = "中秋"; 375 } else if ((month == 9) && day == 9) { 376 message = "重阳"; 377 } else if ((month == 12) && day == 8) { 378 message = "腊八"; 379 } else { 380 if (month == 12) { 381 if ((((monthDays(year, month) == 29) && day == 29)) 382 || ((((monthDays(year, month) == 30) && day == 30)))) { 383 message = "除夕"; 384 } 385 } 386 } 387 return message; 388 } 389 }

 

4)

CalendarView

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 (14)附数据库、发布项目 - 果冻布丁喜

    【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目

    2016-07-30 12:00

  • 分享自己的超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上 - 陌城心灵捕手

    分享自己的超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上 -

    2016-07-29 14:00

  • 【S】【S】【S】一大波前端干货整合(一) - Van小时

    【S】【S】【S】一大波前端干货整合(一) - Van小时

    2016-07-28 15:00

  • 独立开发 一个社交 APP 的架构分享 (已实现) - 指尖下的幽灵

    独立开发 一个社交 APP 的架构分享 (已实现) - 指尖下的幽灵

    2016-07-19 16:00

网友点评