Android studio 计算今天和我下一个生日之间的天数

Android studio 计算今天和我下一个生日之间的天数,android-studio,date,Android Studio,Date,目前我正在做一个android studio项目。我需要一个函数,返回从今天到下一个生日之间的天数。 i、 e 我将使用返回值进行通知 如果今天是2020年5月23日,而我的出生日期是1999年5月28日,则函数应保持为5。 我在安卓工作室非常不熟,所以请原谅我的错误。谢谢:)我想我找到了答案。如果有问题,请告诉我 long daysForBirthday(String dob){ SimpleDateFormat format = new SimpleDateFormat("d

目前我正在做一个android studio项目。我需要一个函数,返回从今天到下一个生日之间的天数。 i、 e

我将使用返回值进行通知

如果今天是2020年5月23日,而我的出生日期是1999年5月28日,则函数应保持为5。
我在安卓工作室非常不熟,所以请原谅我的错误。谢谢:)

我想我找到了答案。如果有问题,请告诉我

long daysForBirthday(String dob){
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
        String dateOB=dob.split("/")[0]+"/"+dob.split("/")[1]+"/"+Calendar.getInstance().get(Calendar.YEAR);
        if((Calendar.getInstance().get(Calendar.YEAR)%4!=0)&&(Integer.parseInt(dob.split("/")[0])==29)&&(Integer.parseInt(dob.split("/")[1])==2)){
            dateOB="01/03/"+Calendar.getInstance().get(Calendar.YEAR);
        }
        try {
            Date bday=format.parse(dateOB);
            Date today=Calendar.getInstance().getTime();
            assert bday!=null;
            if(bday.before(today)){
                Calendar c=Calendar.getInstance();
                c.setTime(bday);
                c.add(Calendar.YEAR,1);
                bday=new Date(c.getTimeInMillis());
            }
            return TimeUnit.DAYS.convert(bday.getTime()-today.getTime(),TimeUnit.MILLISECONDS);
        } catch (ParseException e) {
            e.printStackTrace();
            return -1;
        }
    }

我想我找到了答案。如果有问题,请告诉我

long daysForBirthday(String dob){
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
        String dateOB=dob.split("/")[0]+"/"+dob.split("/")[1]+"/"+Calendar.getInstance().get(Calendar.YEAR);
        if((Calendar.getInstance().get(Calendar.YEAR)%4!=0)&&(Integer.parseInt(dob.split("/")[0])==29)&&(Integer.parseInt(dob.split("/")[1])==2)){
            dateOB="01/03/"+Calendar.getInstance().get(Calendar.YEAR);
        }
        try {
            Date bday=format.parse(dateOB);
            Date today=Calendar.getInstance().getTime();
            assert bday!=null;
            if(bday.before(today)){
                Calendar c=Calendar.getInstance();
                c.setTime(bday);
                c.add(Calendar.YEAR,1);
                bday=new Date(c.getTimeInMillis());
            }
            return TimeUnit.DAYS.convert(bday.getTime()-today.getTime(),TimeUnit.MILLISECONDS);
        } catch (ParseException e) {
            e.printStackTrace();
            return -1;
        }
    }
java.time和ThreeTenABP 我的建议是使用java.time,即现代java日期和时间API:

public static int daysRemain(LocalDate dob){
    LocalDate today = LocalDate.now(ZoneId.of("Asia/Kolkata"));
    long age = ChronoUnit.YEARS.between(dob, today);
    LocalDate nextBirthday = dob.plusYears(age);
    if (nextBirthday.isBefore(today)) {
        nextBirthday = dob.plusYears(age + 1);
    }
    long daysUntilNextBirthday = ChronoUnit.DAYS.between(today, nextBirthday);
    return Math.toIntExact(daysUntilNextBirthday);
}
让我们试一下:

    System.out.println(daysRemain(LocalDate.of(1999, Month.MAY, 28)));
当我今天(5月25日在印度)运行此呼叫时,输出为:

三,

问:java.time不需要Android API级别26吗? time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻
java.time和ThreeTenABP 我的建议是使用java.time,即现代java日期和时间API:

public static int daysRemain(LocalDate dob){
    LocalDate today = LocalDate.now(ZoneId.of("Asia/Kolkata"));
    long age = ChronoUnit.YEARS.between(dob, today);
    LocalDate nextBirthday = dob.plusYears(age);
    if (nextBirthday.isBefore(today)) {
        nextBirthday = dob.plusYears(age + 1);
    }
    long daysUntilNextBirthday = ChronoUnit.DAYS.between(today, nextBirthday);
    return Math.toIntExact(daysUntilNextBirthday);
}
让我们试一下:

    System.out.println(daysRemain(LocalDate.of(1999, Month.MAY, 28)));
当我今天(5月25日在印度)运行此呼叫时,输出为:

三,

问:java.time不需要Android API级别26吗? time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

这可能是你要找的,谢谢.EL.DAPO。这也帮助了我。这可能是你要找的,谢谢。@ el.dAPO,这也帮了我。考虑扔掉长期过时和臭名昭著的麻烦<代码> SimpleDateFormat <代码>和朋友,并添加到你的Android项目中,以便使用javaTimes,现代Java日期和时间API。和你一起工作真是太好了。我今天在印度5月25日打电话给daysForBirthday(“1999年5月28日”)得到了2天,我不知道为什么。我认为它给出的一天太少的原因是它测量了从这一刻到生日开始的时间,并舍入到整数天。你可能想从今天的日期开始数数,或者向上取整,而不是向下取整。所以我认为,我认为它排除了2020年5月25日的日期,考虑到抛弃了长期过时且臭名昭著的麻烦
SimpleDateFormat
和朋友,并添加到您的Android项目中,以便使用java.time,即现代java日期和时间API。和你一起工作真是太好了。我今天在印度5月25日打电话给daysForBirthday(“1999年5月28日”)得到了2天,我不知道为什么。我认为它给出的一天太少的原因是它测量了从这一刻到生日开始的时间,并舍入到整数天。你可能想从今天的日期开始数数,或者向上取整,而不是向下取整。我想是的。我想它不包括2020年5月25日。你能验证我添加的答案吗?谢谢。你能证实我补充的答案吗?