JAVA 实现预产期计算器

本文介绍了一种使用JAVA实现的预产期计算器算法,详细解释了如何根据最后一次月经时间计算预产期,并提供了完整的代码示例及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 文章存档




###################################################################################################




JAVA 实现预产期计算器

标签: JAVA预产期计算器
1968人阅读 评论(0) 收藏 举报
分类:

  一天,有人问我,大师,怀孕32周是几个月呢?

 答:7个月零两个星期,

 为什么网上都是说8个月呢,从小就知道 4×8=32,医生也跟我说是7个月零两个星期,这是怎么算出来的。


大师♂罗莊今天就把所有预产期计算器算法说下吧:

  如果月经周期不是28天的话,最后结果需要和(28- 月经周期)天数做加减,留给大家去思考了。

  1. package test;  
  2.   
  3. import java.text.ParseException;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.Calendar;  
  6. import java.util.Date;  
  7. import java.util.GregorianCalendar;  
  8.   
  9.   
  10. /**有关预产期计算的算法 
  11.  * @author 大师♂罗莊 
  12.  * 
  13.  */  
  14. public class pregnancyHelp {  
  15.   
  16.     /** 
  17.      * @param args 
  18.      * @throws ParseException 
  19.      */  
  20.     public static void main(String[] args) throws ParseException {  
  21.         // 请输入您的最后一次来月经的时间  
  22.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  23.         Date d1 = sdf.parse("2014-2-20");  
  24.         Calendar d = Calendar.getInstance();  
  25.         d.setTime(d1);  
  26.         setValue(d);  
  27.   
  28.     }  
  29.   
  30.     /** 
  31.      * @param localCalendar1 
  32.      *            末次月经时间 
  33.      * @throws ParseException 
  34.      */  
  35.     private static void setValue(Calendar localCalendar1) throws ParseException {  
  36.   
  37.         // 取今天时间  
  38.         Calendar Calendartoday = Calendar.getInstance();  
  39.         // 克隆一个保存下  
  40.         Calendar Calendarborn = (Calendar) localCalendar1.clone();  
  41.   
  42.         // 取今天和末次月经时间相差多少天  
  43.         long daysBetweennumber = daysBetween(localCalendar1.getTime(),  
  44.                 Calendartoday.getTime());  
  45.   
  46.         // 算出多少周  
  47.         int WeekBetweennumber = (int) daysBetweennumber / 7;  
  48.         // 零多少天  
  49.         long i1 = (daysBetweennumber + 1) % 7;  
  50.   
  51.         // 电脑计算预产期,只需在末次月经第一天加上9个月零1周(280天)即可  
  52.         Calendarborn.add(Calendar.DAY_OF_MONTH, 280);  
  53.   
  54.         // 计算预产期距离今天还有几天  
  55.         long borndayBetween = -1  
  56.                 + daysBetween(Calendartoday.getTime(), Calendarborn.getTime());  
  57.   
  58.         // 为输出年月日做准备  
  59.         int bornyear = Calendarborn.get(Calendar.YEAR);  
  60.         int bornmonth = 1 + Calendarborn.get(Calendar.MONTH);  
  61.         // MONTH加1的原因: public static final int MONTH 指示月份的 get 和 set  
  62.         // 的字段数字。这是一个特定于日历的值。在格里高利历和罗马儒略历中一年中的第一个月是 JANUARY,它为 0;  
  63.         // 最后一个月取决于一年中的月份数。 简单来说,因为这个值的初始值是0,因此我们要用它来表示正确的月份时就需要加1。  
  64.         int bornday = Calendarborn.get(Calendar.DAY_OF_MONTH);  
  65.   
  66.         System.out.println("您已经怀孕" + daysBetweennumber + "天");  
  67.         String current = (WeekBetweennumber + "周" + i1 + "天");  
  68.         System.out.println("怀孕周数" + current);  
  69.         getMediMonthSpace(WeekBetweennumber);  
  70.         System.out.println("怀孕月数(直接减去法)"  
  71.                 + getMonthSpace(localCalendar1, Calendartoday) + "个月");  
  72.         String born = (borndayBetween + "天");  
  73.         System.out.println("距离宝宝出生还有" + born);  
  74.         String borndayString = (String.valueOf(bornyear) + "年"  
  75.                 + String.valueOf(bornmonth) + "月" + String.valueOf(bornday) + "日");  
  76.         System.out.println("预产期为" + borndayString);  
  77.         Calendarbornmanual(localCalendar1);  
  78.     }  
  79.   
  80.     /** 
  81.      * 计算方法:从末次月经第一天算起,月份减3,如不够时则加9,日数加7。 
  82.      *  
  83.      * @param cal 
  84.      *            从末次月经 
  85.      */  
  86.     static void Calendarbornmanual(Calendar cal) {  
  87.         Calendar temp = (Calendar) cal.clone();  
  88.         int month1 = temp.get(Calendar.MONTH) + 1;  
  89.         if (month1 < 3) {  
  90.             temp.add(Calendar.MONTH, 9);  
  91.         } else {  
  92.             temp.add(Calendar.MONTH, -3);  
  93.             temp.add(Calendar.YEAR, 1);  
  94.         }  
  95.         temp.add(Calendar.DAY_OF_MONTH, 7);  
  96.         System.out.println("人手工计算的预产期为");  
  97.         outprint(temp);  
  98.     }  
  99.   
  100.     /** 
  101.      * 计算两个日期之间相差的天数 需要用calendar,因为Date返回的永远是UTC时间,也就是时区永远比我们晚8个小时。 
  102.      *  
  103.      * @param smdate 
  104.      *            较小的时间 
  105.      * @param bdate 
  106.      *            较大的时间 
  107.      * @return 相差天数 
  108.      * @throws ParseException 
  109.      */  
  110.     public static long daysBetween(Date smdate, Date bdate)  
  111.             throws ParseException {  
  112.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  113.         smdate = sdf.parse(sdf.format(smdate));  
  114.         bdate = sdf.parse(sdf.format(bdate));  
  115.         Calendar cal = Calendar.getInstance();  
  116.         cal.setTime(smdate);  
  117.         long time1 = cal.getTimeInMillis();  
  118.         cal.setTime(bdate);  
  119.         long time2 = cal.getTimeInMillis();  
  120.         long between_days = (time2 - time1) / (1000 * 3600 * 24);  
  121.         return between_days;  
  122.     }  
  123.   
  124.     static void outprint(Calendar cal) {  
  125.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
  126.   
  127.         // 打印  
  128.         System.out.println(dateFormat.format(cal.getTime()));  
  129.   
  130.     }  
  131.   
  132.     /** 
  133.      * 有人问我32w+(32周)怀孕几个月 
  134.      *  
  135.      * @param week 
  136.      *            输入周数 
  137.      */  
  138.     public static void getMediMonthSpace(int week) {  
  139.         // 此算法同原昆明某三甲医院产科主任算法一致,所以为什么我的算法和她医生算出来的一致  
  140.         int month = week * 7 / 30;// 周数算出月数,可以按28天或者30天算  
  141.         int weekleave = week * 7 % 30;// 周数算出剩下的天数  
  142.         // 也可以通过/7算出周数,大家自己去补充了  
  143.         System.out.print("怀孕月数(计算法)" + month + "个月");  
  144.         System.out.println(weekleave + "天");  
  145.     }  
  146.   
  147.     /** 
  148.      * 算两个日期差几个月,不能用Calendar.MONTH直接相减,否则2012年11月和2013年11月就是0 
  149.      *  
  150.      * @param scalendar 
  151.      *            日期1 
  152.      * @param calendar 
  153.      *            日期2 
  154.      * @return 两个日期差几个月 
  155.      */  
  156.     public static int getMonthSpace(Calendar scalendar, Calendar calendar) {  
  157.   
  158.         int year1 = calendar.get(Calendar.YEAR);  
  159.         int year2 = scalendar.get(Calendar.YEAR);  
  160.         int month1 = calendar.get(Calendar.MONTH);  
  161.         int month2 = scalendar.get(Calendar.MONTH);  
  162.   
  163.         int count = 0;  
  164.         if (year1 == year2 && month1 > month2) {  
  165.             count = month1 - month2;  
  166.         } else if (year1 == year2 && month1 < month2) {  
  167.             count = month2 - month1;  
  168.         } else if (year1 > year2 && month1 > month2) {  
  169.             count = (year1 - year2) * 12 + (month1 - month2);  
  170.         } else if (year1 > year2 && month1 < month2) {  
  171.             count = (year1 - year1) * 12 + (month2 - month1);  
  172.         } else if (year1 < year2 && month1 > month2) {  
  173.             count = (year2 - year1) * 12 + month1 - month2;  
  174.         } else if (year1 < year2 && month1 < month2) {  
  175.             count = (year2 - year1) * 12 + month2 - month1;  
  176.         }  
  177.         if (count < 0) {  
  178.   
  179.             count = Math.abs(count);  
  180.         }  
  181.         return count;  
  182.     }  
  183.   
  184.   
  185. }  

输出

  1. 您已经怀孕230天  
  2. 怀孕周数32周0天  
  3. 怀孕月数(计算法)7个月14天  
  4. 怀孕月数(直接减去法)8个月  
  5. 距离宝宝出生还有49天  
  6. 预产期为2014年11月27日  
  7. 人手工计算的预产期为  
  8. 2014-11-27  



 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值