获取一个Java日期或日历的时间组件(Getting the Time component of a

2019-07-04 06:31发布

有一个简单的或优雅的方式来攫取只有一天(时/分/秒/毫秒)的Java日期时部(或日历,它真的并不重要,我)? 我在找一个很好的方式,分别审议日期(年/月/日)和时间的日部分,但据我所知,我坚持与单独访问每个字段。

我知道我可以写我自己的方法分别抓住我感兴趣的领域,但我会做它作为一个静态实用方法,这是丑陋的。 另外,我知道日期和日历对象有精确到毫秒,但我不明白的方式来访问在这两种情况下的毫秒组件。


编辑:我并不清楚这一点:使用日期的一个::的getTime()或日历:: getTimeInMillis对我来说并不非常有用,因为这些从纪元返回毫秒数(由该日期或日历表示) ,这实际上不从其余的信息分开一天的时间

@ Jherico的答案是最接近的事情,我想,但绝对是我想还是要擀成我写我自己的方法。 这不正是我要去的,因为它仍包含小时,分钟,并在返回的毫秒值秒 - 虽然我大概可以让我的目的工作。

我仍然认为每个组件作为单独的,但当然,他们不是。 你可以写一个时间的毫秒数,因为任意一个参考日期,或者你可以写完全相同的时间为year/month/day hours:minutes:seconds.milliseconds

这是不是显示的目的。 我知道如何使用DateFormat ,使漂亮的日期字符串。


编辑2:我原来的问题是在小范围的实用功能出现了,我发现自己写-例如:

  • 检查两者是否Date s为当天的日期,时间;
  • 检查日期是否是由其他两个日期指定的范围内,但有时检查包含性,有时不取决于时间组件上。

并约达时间有这种类型的功能?


编辑3:@乔恩的问题,关于我的第二个要求,我只想澄清:第二个要求是用我的日期有时代表了整个天的结果-在时间组件并不在所有问题-有时代表一个日期-时间(这是,海事组织,什么东西最准确的词,包含year/month/day hours:minutes:seconds:... )。

当日期表示一整天,它的时间部分是零(例如日期的“时间组件”是午夜),但语义决定的范围检查的结束日期包含地完成。 因为我刚离开这个检查达日期前::和日期::后,我有1天添加到结束日期 - 因此特别套管用于当日期时间的天分量为零。

希望没有做的事情不太清楚。

Answer 1:

好吧,我知道这是一个可预见的答案,但...使用乔达时间 。 这是否有“日期”,“瞬间”等。“一天的时间”这是一个更丰富的API和一般理智的一个比内置类,IMO单独表示。

如果这是日期/时间操纵的唯一位你感兴趣的则可能是矫枉过正...但如果您使用的是什么显著内置的日期/时间API,我强烈建议您将远离它乔达只要你所能。

顺便说一句,你应该考虑什么时候带你感兴趣的。一个Calendar具有相关联的时区,但Date没有(它只是代表了一个时刻,从Unix纪元以毫秒计)。



Answer 2:

提取一天的时间部分应该得到毫秒的数量剩余当您每天的毫秒数划分的问题。

long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
Date now = Calendar.getInstance().getTime();
long timePortion = now.getTime() % MILLIS_PER_DAY;

另外,可以考虑使用乔达时间,更全功能时库。



Answer 3:

要回答它的一部分,访问毫秒组件就像下面这样:

long mill = Calendar.getInstance().getTime();

我不知道你想用具体做什么,但你可以使用java.text.SimpleDateFormat的类,如果它是文本输出。



Answer 4:

你可以调用一个日历对象的getTimeInMillis()函数来获取毫秒的时间。 你可以打电话获得一个日历对象(Calendar.MILLISECOND),以获得第二的毫秒。 如果你想显示从日期或日历对象时,使用DateFormat类。 例如:。DateFormat.getTimeInstance()格式(现在)。 另外还有一点,你可以使用的SimpleDateFormat类。



Answer 5:

要使用乔达时得到的只是时间,使用org.joda.time.LocalTime类作为在这个问题上,可谓无日乔达时间,时间 。

作为用于比较日期仅在有效地忽略时间,在约达时间调用withTimeAtStartOfDay()上的每个方法DateTime实例来设置相同的时间值。 下面是使用乔达时间2.3,类似于今天我在另一个答案张贴一些示例代码。

    // © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

    // Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier.
    // http://www.joda.org/joda-time/

    // Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8.
    // JSR 310 was inspired by Joda-Time but is not directly based on it.
    // http://jcp.org/en/jsr/detail?id=310

    // By default, Joda-Time produces strings in the standard ISO 8601 format.
    // https://en.wikipedia.org/wiki/ISO_8601

    // Capture one moment in time.
    org.joda.time.DateTime now = new org.joda.time.DateTime();
    System.out.println("Now: " + now);

    // Calculate approximately same time yesterday.
    org.joda.time.DateTime yesterday = now.minusDays(1);
    System.out.println("Yesterday: " + yesterday);

    // Compare dates. A DateTime includes time (hence the name).
    // So effectively eliminate the time by setting to start of day.
    Boolean isTodaySameDateAsYesterday = now.withTimeAtStartOfDay().isEqual(yesterday.withTimeAtStartOfDay());
    System.out.println("Is today same date as yesterday: " + isTodaySameDateAsYesterday);

    org.joda.time.DateTime halloweenInUnitedStates = new org.joda.time.DateTime(2013, 10, 31, 0, 0);
    Boolean isFirstMomentSameDateAsHalloween = now.withTimeAtStartOfDay().isEqual(halloweenInUnitedStates.withTimeAtStartOfDay());
    System.out.println("Is now the same date as Halloween in the US: " + isFirstMomentSameDateAsHalloween);


Answer 6:

如果所有你担心越来越成用于显示或保存字符串,那么只需要创建一个SimpleDateFormat的只显示时间部分,如新的SimpleDateFormat(“HH:MM:SS”)。 日期尚未Date对象,当然,但你不在乎。

如果你想要做就可以了算术,喜欢拿两个Date对象并找到他们多少秒的间隔而忽略日期部分,让“2009-09-01 11:00:00”减“1941年12月7日09 :00:00" 等于2小时,那么我认为你需要使用像Jherico的一个解决方案:让很长一段时间,并采取模块1天。



Answer 7:

你为什么要分开呢? 如果你的意思做的时间部分的任何算术,你会很快陷入困境。 如果您拔出日下午11:59,并添加一分钟,现在你的时间和日期是分开的,你搞砸自己 - you'll具有无效的时间和不正确的日期。

如果你只是想显示他们,然后将各种简单的日期格式的应该得到你想要的到底是什么。

如果你想操作的日期,我建议你长期价值和基础事事休的那个。 在任何时候,你可以采取的长,适用的格式,以获得分钟/小时/秒,非常轻松地显示。

但我只是有点担心与单独操纵日期和时间的概念,似乎是开罐头O”蠕虫。 (更不用提,甚至时区的问题!)。

我相当肯定这就是为什么Java没有一个简单的方法来做到这一点。



Answer 8:

在下面找到它使用约达时间,并支持时区的解决方案。 所以,你会获得日期和时间(到currentDatecurrentTime在JVM当前配置的时区)。

请注意,约达时间不支持闰秒 。 所以,你可以离开的真正价值大约26或27秒。 这可能仅在未来50年得到解决,当累积误差将接近1分钟,人们会开始关心它。

参见: https://en.wikipedia.org/wiki/Leap_second

/**
 * This class splits the current date/time (now!) and an informed date/time into their components:
 * <lu>
 *     <li>schedulable: if the informed date/time is in the present (now!) or in future.</li>
 *     <li>informedDate: the date (only) part of the informed date/time</li>
 *     <li>informedTime: the time (only) part of the informed date/time</li>
 *     <li>currentDate: the date (only) part of the current date/time (now!)</li>
 *     <li>currentTime: the time (only) part of the current date/time (now!)</li>
 * </lu>
 */
public class ScheduleDateTime {
    public final boolean schedulable;
    public final long millis;
    public final java.util.Date informedDate;
    public final java.util.Date informedTime;
    public final java.util.Date currentDate;
    public final java.util.Date currentTime;

    public ScheduleDateTime(long millis) {
        final long now = System.currentTimeMillis();
        this.schedulable = (millis > -1L) && (millis >= now);

        final TimeZoneUtils tz = new TimeZoneUtils();

        final java.util.Date          dmillis   = new java.util.Date( (millis > -1L) ? millis : now );
        final java.time.ZonedDateTime zdtmillis = java.time.ZonedDateTime.ofInstant(dmillis.toInstant(), java.time.ZoneId.systemDefault());
        final java.util.Date          zdmillis  = java.util.Date.from(tz.tzdate(zdtmillis));
        final java.util.Date          ztmillis  = new java.util.Date(tz.tztime(zdtmillis));

        final java.util.Date          dnow   = new java.util.Date(now);
        final java.time.ZonedDateTime zdtnow = java.time.ZonedDateTime.ofInstant(dnow.toInstant(), java.time.ZoneId.systemDefault());
        final java.util.Date          zdnow  = java.util.Date.from(tz.tzdate(zdtnow));
        final java.util.Date          ztnow  = new java.util.Date(tz.tztime(zdtnow));

        this.millis       = millis;
        this.informedDate = zdmillis;
        this.informedTime = ztmillis;
        this.currentDate  = zdnow;
        this.currentTime  = ztnow;
    }
}



public class TimeZoneUtils {

    public java.time.Instant tzdate() {
        final java.time.ZonedDateTime zdtime = java.time.ZonedDateTime.now();
        return tzdate(zdtime);
    }
    public java.time.Instant tzdate(java.time.ZonedDateTime zdtime) {
        final java.time.ZonedDateTime zddate = zdtime.truncatedTo(java.time.temporal.ChronoUnit.DAYS);
        final java.time.Instant instant = zddate.toInstant();
        return instant;
    }

    public long tztime() {
        final java.time.ZonedDateTime zdtime = java.time.ZonedDateTime.now();
        return tztime(zdtime);
     }
    public long tztime(java.time.ZonedDateTime zdtime) {
        final java.time.ZonedDateTime zddate = zdtime.truncatedTo(java.time.temporal.ChronoUnit.DAYS);
        final long millis = zddate.until(zdtime, java.time.temporal.ChronoUnit.MILLIS);
        return millis;
    }
}


Answer 9:

TL;博士

LocalTime lt = myUtilDate.toInstant().atZone( ZoneId.of( "America/Montreal" ) ).toLocalTime() ;

避免旧日期,时间类

您正在使用旧的遗留日期时间类。 他们是麻烦和混乱; 避免它们。

而是使用java.time类。 这些取代老班还有乔达时库。

兑换

将您的java.util.Date一个Instant

Instant类表示在时间轴上的时刻UTC ,分辨率为纳秒 。

Instant instant = myUtilDate.toInstant();

时区

套用一个时区。 时区是至关重要的。 对于任何给定时刻的日期由区全球各地的变化。 例如,午夜在巴黎法国后几分钟是新的一天,同时在蒙特利尔魁北克是“昨天”。

应用ZoneId获得ZonedDateTime对象。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

Local…类型

LocalDate类表示没有时间一天和不同时区的日期,唯一的价值。 同样, LocalTime表示没有日期,没有一个时区时间的一天。 你可以把这些作为两个部件,其与一起ZoneIdZonedDateTime 。 您可以从提取这些ZonedDateTime

LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();

字符串

如果你的目标只是产生了弦乐呈现给用户,不需要在Local…类型。 相反,使用DateTimeFormatter以产生表示只有日期部分或时间部分字符串。 这个类是足够聪明的自动定位而产生的字符串。

指定Locale来确定(一)用于转换日的名称人类的语言,一个月的名称,这样,和(b)来决定的问题,如缩写,大小写,标点符号,这样的文化规范。

Locale l = Locale.CANADA_FRENCH ;  // Or Locale.US, Locale.ITALY, etc.

DateTimeFormatter fDate = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( locale );
String outputDate = zdt.format( fDate );

DateTimeFormatter fTime = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ).withLocale( locale );
String outputTime = zdt.format( fTime );

关于java.time

该java.time框架是建立在Java 8和更高版本。 这些类取代旧的麻烦日期时间类,如java.util.Date.Calendar ,与java.text.SimpleDateFormat

该乔达-时间的项目,现在在维护模式 ,建议迁移java.time。

要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,并进一步适应的Android在ThreeTenABP (见如何使用...... )。

该ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。



Answer 10:

使用日历API -

向1-

Calendar c = Calendar.getInstance();
String timeComp = c.get(Calendar.HOUR_OF_DAY)+":"+c.get(Calendar.MINUTE)+":"+c.get(Calendar.SECOND)+":"+c.get(Calendar.MILLISECOND);
System.out.println(timeComp);  

输出 - 13:24:54:212

将2-

SimpleDateFormat time_format = new SimpleDateFormat("HH:mm:ss.SSS");
String timeComp = time_format.format(Calendar.getInstance().getTime());

输出 - 15:57:25.518



文章来源: Getting the Time component of a Java Date or Calendar