android 减去和比较日期

bfrts1fy  于 2023-01-19  发布在  Android
关注(0)|答案(5)|浏览(153)

我在 * SO * 上发现了一些类似的问题,但还没有找到解决方案。
今天的Date如下所示:(假设它为Date1,其值为2012-06-22

Calendar cal = Calendar.getInstance();
    SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy-MM-dd");
    Date start = cal.getTime();
    String currentDate=dateformatter.format(start);

我从用户那里检索4个值:

  • 特定日期(假设5
  • 特定月份(假设1
  • 特定年份(假设2012
  • 天数(假设7

因此,这个日期,比如说Date2变为2012-01-05(* yyyy-MM-dd *),同时天数设置为7
我想比较日期1日期2-天数
我知道通过使用下面的代码段,可以从日历示例中减去特定的天数。

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -7);

但是由于我有String形式的Date2,所以我不能遵循这种方法。
任何帮助都感激不尽。

编辑:

根据您的建议,我将能够使用SimpleDateFormatparse方法将String转换为Date
现在我有2个Date对象。

  • 如何找出它们之间在daysmonthsyears方面的差异
  • 如何从特定日期(例如2012-01-05)中减去特定天数(例如7)?
9rygscc1

9rygscc11#

使用SimpleDateFormatString(表示日期)转换为Date
例如:

Date parsedDate  = new SimpleDateFormat("yyyy-MM-dd").parse("2012-01-05");
q9yhzks0

q9yhzks02#

如果你可以用Joda Time来代替Date/Calendar,那就这么做吧,这会让你的生活更轻松。
如果没有,听起来就像您不想 * 格式化 * 当前日期-相反,您想 * 解析 * 来自用户的Date2

Date date2 = dateFormatter.parse(text);

然后,您可以 * 或者 * 创建一个日历并减去特定的天数,或者(如果您谈论的是经过的时间-您需要考虑您在DST转换和时区周围的行为)您可以从date2.getTime()中减去7 * 24 * 60 * 60 * 1000毫秒。
从根本上说,应该尽早将 out 从字符串格式转换出来,并且只在确实需要时才将 * 转换为 * 字符串格式--当然不是为了比较。这种数据的自然表示形式是DateCalendar(假设您坚持使用JDK),因此请努力将数据转换为这种表示形式。
你有几个真正的“业务”问题要考虑虽然:

  • 您是要将当前 * 日期 * 与用户给定的日期进行比较,还是要将当前 * 日期和时间 * 与用户给定的日期进行比较?
  • 您希望使用哪个时区进行用户输入?
  • 您考虑的是经过的天数还是“逻辑”天数?因为由于DST转换,早于1.30am的7 * 24小时可能是2.30am,反之亦然

你应该在实现你的代码之前回答所有这些问题,因为这会影响你使用的表示。同样,在开始实现之前,为你能想到的所有东西编写单元测试。

z2acfund

z2acfund3#

据我所知,你现在有两个日期,你想从日期中减去特定的天数。
首先,可以使用SimpleDateFormat将日期转换为字符串,将字符串转换为日期
现在减去天数,比如说7。你可以得到日期的时间,然后从中减去72460601000

long daybeforeLong = 7 * 24 * 60 * 60 * 1000;
try {

Date todayDate = new Date();

long nowLong = todayDate.getTime();

Date beforeDate = new Date((nowLong - daybeforeLong));

    } 

catch (ParseException e) {
// TODO Auto-generated catch block
                                                e.printStackTrace();
}
tyg4sfes

tyg4sfes4#

我认为你可以利用java提供的比较器来比较和排序日期。这里是link
希望你能得到你想要的。

wnavrhmk

wnavrhmk5#

Java.时间

问题和公认的答案使用了java.util日期-时间API及其解析/格式化API SimpleDateFormat,这在2012年使用标准库是合适的。2014年3月,Java 8引入了modern Date-Time API,取代了传统API,从那时起,强烈建议使用现代日期-时间API。
此外,下面引用的是home page of Joda-Time的一则通知:

请注意,从Java SE 8开始,用户需要迁移到java.time(JSR-310)-JDK的核心部分,它将取代此项目。

从您的问题中复制的要求:

根据您的建议,我将能够使用SimpleDateFormat的解析方法将String转换为Date
现在我有2个Date对象。

  • 如何找出它们在daysmonthsyears方面的差异?
  • 如何从一个特定的日期(比如2012-01-05)中减去特定的天数(比如7)?

使用java.time(现代日期-时间API)的解决方案:

使用java.time,您可以将日期字符串解析为LocalDate,然后查找此日期和当前日期之间的Period(通过LocalDate.now()获得)。您还可以减去日、月和年使用类似minusXxx/minus的方法。您有类似的方法(plusXxx/plus)来添加这些单位。请查看the documentation of LocalDate以了解更多信息。

注意java.time API基于ISO 8601,因此您不需要DateTimeFormatter来解析已经是ISO 8601格式的日期-时间字符串(例如您的日期-时间字符串2012-06-22)。
演示

import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;

class Main {
    public static void main(String[] args) {
        LocalDate then = LocalDate.parse("2012-06-22");
        LocalDate now = LocalDate.now();

        Period period = Period.between(then, now);
        System.out.println(period);
        System.out.printf("%d years %d months %d days%n", period.getYears(), period.getMonths(), period.getDays());

        // Examples of subtracting date units
        LocalDate sevenDaysAgo = now.minusDays(7);
        System.out.println(sevenDaysAgo);
        // Alternatively
        sevenDaysAgo = now.minus(7, ChronoUnit.DAYS);
        System.out.println(sevenDaysAgo);
    }
}

示例运行的输出:

P10Y6M27D
10 years 6 months 27 days
2023-01-11
2023-01-11

ONLINE DEMO
从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

相关问题