如何获取当前日期和时间 - date() 和 calendar()。

5
我希望以当前日期为基准,将小时和分钟设置为从2016年10月10日开始,一直持续到当天结束。
package com.mkyong.date;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDifferentExample
{
    public static void main(String[] args)
    {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        //get current date time with Date()
        Date date = new Date();
        System.out.println(dateFormat.format(date));
        //get current date time with Calendar()
        Calendar cal = Calendar.getInstance();
        System.out.println(dateFormat.format(cal.getTime()));
        String dateStart = "01/14/2012 09:29:58";
        String dateStop = "01/15/2012 10:31:48";
        //HH converts hour in 24 hours format (0-23), day calculation
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        Date d1 = null;
        Date d2 = null;
        try
        {
            d1 = format.parse(dateStart);
            d2 = format.parse(dateStop);
            //in milliseconds
            long diff = d2.getTime() - d1.getTime();
            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);
            System.out.print(diffDays + " days, ");
            System.out.print(diffHours + " hours, ");
            System.out.print(diffMinutes + " minutes, ");
            System.out.print(diffSeconds + " seconds.");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

结果:

2016/08/15 18:54:03
2016/08/15 18:54:03
1097 Days1 Hours 1 Minute 50 Second 
My want to result for example :
100 days 5 hours 2 minutes 
2个回答

3

避免使用旧的日期时间类

您正在使用早期版本Java中捆绑的麻烦的旧日期时间类。请改用java.time类。

解析

您的输入字符串几乎符合标准的ISO 8601格式。请将中间的空格替换为T。java.time类默认使用ISO 8601格式解析/生成字符串,因此无需指定格式化模式。

String startInput = "01/14/2012 09:29:58".replace( " " , "T" );
String stopInput = "01/15/2012 10:31:48".replace( " " , "T" );

LocalDateTime

您提供的输入缺少关于UTC偏移或时区的任何信息。因此,我们将其解析为LocalDateTime对象。

LocalDateTime startLdt = LocalDateTime.parse( startInput );
LocalDateTime stopLdt = LocalDateTime.parse( stopInput );

如果您进一步使用这些类型,您将获得基于通用的24小时日的结果,而忽略像夏令时(DST)这样的异常情况。

如果您知道此数据的上下文是特定的时区,请应用该时区以获取 ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime start = startLdt.atZone( zoneId );
ZonedDateTime stop = stopLdt.atZone( zoneId );

如果您想将当前时刻作为起始时间或结束时间,请调用now。传递所需/期望的时区,而不是依赖于JVM的当前默认时区。

ZonedDateTime now = ZonedDateTime.now( zoneId );

持续时间

Duration 类表示时间跨度,以秒为单位,并含有纳秒分辨率的小数部分。

Duration duration = Duration.between( start , stop );

奇怪的是,在Java 8中,这个类缺少获取组成时间跨度的天数、小时数等方法。Java 9 添加了to…Part方法

long days = duration.toDaysPart();
int hours = duration.toHoursPart();
int minutes = duration.toMinutesPart();

在Java 9之前,您可以自己进行计算。

关于java.time

java.time框架已内置于Java 8及更高版本。这些类取代了旧的麻烦日期时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time项目现处于维护模式,建议迁移到java.time。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow上搜索许多示例和解释。

许多java.time功能在ThreeTen-Backport中向Java 6和7进行了后移,并在ThreeTenABP中进一步适应了Android

ThreeTen-Extra项目通过增加其他类来扩展java.time。该项目是java.time可能将来添加的内容的试验场所。您可以在此处找到一些有用的类,如IntervalYearWeekYearQuarter等。


1

public final void set(int year,int month,int date) - 这个Calendar类的方法可以用来设置日期。

public final void set(int year, int month,int date,int hourOfDay,int minute,int second) 也可以用来设置时间。

Calendar.getInstance() 默认设置当前日期和时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接