Java类库有一个名为DateTime的类.DateTime有这个方法:
int daysBetween(DateTime other)
Run Code Online (Sandbox Code Playgroud)
返回此参数与参数之间的天数.它没有方法
int secondsBetween(DateTime other)
Run Code Online (Sandbox Code Playgroud)
我碰巧需要它.是否有一个类似于DateTime的类但有这样的方法?
有很多答案,但我无法找到与我的情况兼容.我需要找到8小时的差异以及日期变化.就像时间大于8小时然后不执行某些事情.
我们有没有LocalDateTime
在Java-8中实现相同的方法?
我试过使用以下但无法实现相同的目标.
LocalDateTime fromDateTime = LocalDateTime.of(2017, 07, 07, 07, 00, 55);
LocalDateTime toDateTime = LocalDateTime.now();
LocalDateTime tempDateTime = LocalDateTime.from(fromDateTime);
long years = tempDateTime.until(toDateTime, ChronoUnit.YEARS);
tempDateTime = tempDateTime.plusYears(years);
long months = tempDateTime.until(toDateTime, ChronoUnit.MONTHS);
tempDateTime = tempDateTime.plusMonths(months);
long days = tempDateTime.until(toDateTime, ChronoUnit.DAYS);
tempDateTime = tempDateTime.plusDays(days);
long hours = tempDateTime.until(toDateTime, ChronoUnit.HOURS);
tempDateTime = tempDateTime.plusHours(hours);
long minutes = tempDateTime.until(toDateTime, ChronoUnit.MINUTES);
tempDateTime = tempDateTime.plusMinutes(minutes);
long seconds = tempDateTime.until(toDateTime, ChronoUnit.SECONDS);
System.out.println("" + java.time.Duration.between(tempDateTime, toDateTime).toHours());
System.out.println(years + " years "
+ months + " …
Run Code Online (Sandbox Code Playgroud) 我知道这可能是一个非常愚蠢的问题,但我想知道是否有办法减去另一个本地日期时间,或者如果没有,将localDateTime强制转换为日期时间然后从那里减去?
我需要能够计算日期时间差,在记录foo的开始和记录栏的开始之间(这也是Foo的结束)
我对java很新,为了简单起见,我希望能够将它保持在大致相同的布局中,而不是必须从秒等转换.
如果添加和减去LocalDateTime不是一个选项,我知道一旦我在dateTime,我可以使用以下方法减去它们:
Period diff = new Period(start, end);
Run Code Online (Sandbox Code Playgroud)
由于数据的目的,我需要保留日期和时间以使其工作,并且如前所述,我希望保持相当简单,因此不需要在秒之间转换回日期.
我的问题实际上只是以可接受的格式得到它,正如我所说,我对java和对象方向整体都是新手,所以请不要嘲笑我这个看似简单的问题.
谢谢,
强尼
我正在尝试用 java.time 替换 org.joda.time.Period 。
我们将以下值存储在数据库中。
P1M, P1Y, P1D, PT1H, PT1M
Run Code Online (Sandbox Code Playgroud)
只是为了解析这个值:
Period monthly = ISOPeriodFormat.standard().parsePeriod(<One of the above value from DB>);
Run Code Online (Sandbox Code Playgroud)
这很简单并且得到预期的周期。但是,现在换成java.time就麻烦了。
因为,P1D, P1M, P1Y
应该使用以下代码进行解析:
java.time.Period period = java.time.Period.parse("P1M");
Run Code Online (Sandbox Code Playgroud)
并且,P1H and P1D
应该使用下面的代码进行解析。
Duration dailyD = Duration.parse("P1D");
Run Code Online (Sandbox Code Playgroud)
所以,我可能还需要一些字符串检查,例如:
if(value.startsWith("PT")) {
// Use java.time.Duration
} else {
// Use java.time.Period
}
Run Code Online (Sandbox Code Playgroud)
这个逻辑有更好的代码吗?
另外,最后,我必须根据上面的 java.time.Period 或 java.time.Duration 查找从某个 startTime 到 截至日期 的出现次数。
就像,如果 startDateTime 是01/01/2015 08:30
:
LocalDateTime startDateTime = // the above startDateTime ..
if(value.startsWith("PT")) { …
Run Code Online (Sandbox Code Playgroud) 我试图计算两个时间戳之间的时间差,这是代码:
Calendar calendar = Calendar.getInstance();
java.util.Date now = calendar.getTime();
Timestamp currentTimestamp = new Timestamp(now.getTime());
System.out.println("Current\n"+currentTimestamp);
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("28/02/2015");
Timestamp timestampBefore = new Timestamp(date.getTime());
System.out.println("Before\n"+timestampBefore);
Timestamp calculated = new Timestamp(currentTimestamp.getTime() - timestampBefore.getTime());
System.out.println("Calculated\n"+calculated);
Run Code Online (Sandbox Code Playgroud)
输出:
Current
2015-02-28 12:12:40.975
Before
2015-02-28 00:00:00.0
Calculated
1970-01-01 13:12:40.975
Run Code Online (Sandbox Code Playgroud)
我可以理解为什么它会返回1970-01-01
,但为什么它会13:12:40.975
多返回 1 小时?
如何计算两个日期之间的差异,以便输出如下(基于此示例):
年:0,月:0,天:0,小时:12,分钟:12,秒:40?
更新:对于低于 1.8 的 java,请查看http://www.joda.org/joda-time/index.html
,对于 java 1.8,请参阅答案。
此处类似的解决方案: Java 8:计算两个 LocalDateTime 之间的差异
我有 2 个本地日期,一个是生日,一个是今天的日期。比较它们并检查年龄是否为 18 岁及以上的最快方法是什么?我是否需要将其转换为字符串并拆分它们然后将它们 1 x 1 进行比较?或者有另一种比较方法吗?
我正在使用 java 8 并且我正在尝试计算两个 OffsetDateTime 对象之间的月数。做这个的最好方式是什么?
有很多SO问题涉及计算Java中两个日期或两个日期之间的差异.许多答案指出了核心Java Date类的问题,并建议使用Jodatime,但AFAIK,没有任何建议使用jsr310如何做到这一点.
那么,有什么方法可以在jsr310中计算两个日期或两个日期之间的差异吗?
作为参考,以下问题可以解决此问题:
在核心Java中:
在Jodatime:
我试图找到两个日期之间的工作日计数(周末和时间必须忽略).我正在使用以下功能来做到这一点.但它给出了多种情况的错误结果,例如,如果startdate是周末还是enddate是周末.这是一个演示的例子,可以计算一天额外的一天.
2018-03-08 00:00:00.0和2018-04-22 01:37:29.887
计数返回32(应该是31,它也在考虑23-04-2018).请提供一些完美的解决方案/方法来做同样的事情.
private static int calculateDuration(Date startDate, Date endDate)
{
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
startCal.set( Calendar.HOUR_OF_DAY, 0 );
startCal.set( Calendar.MINUTE, 0 );
startCal.set( Calendar.SECOND, 0 );
startCal.set( Calendar.MILLISECOND, 0 );
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
endCal.set( Calendar.HOUR_OF_DAY, 0 );
endCal.set( Calendar.MINUTE, 0 );
endCal.set( Calendar.SECOND, 0 );
endCal.set( Calendar.MILLISECOND, 0 );
int workDays = 0;
if (startCal.getTimeInMillis() > endCal.getTimeInMillis())
{
startCal.setTime(endDate);
endCal.setTime(startDate);
}
do
{
startCal.add(Calendar.DAY_OF_MONTH, 1);
System.out.println("************"+Calendar.DAY_OF_WEEK);
System.out.println("Before weekend condition"+Calendar.DAY_OF_WEEK+"Workdays="+workDays);
if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && …
Run Code Online (Sandbox Code Playgroud)