如何将毫秒转换为时间?

时间:2014-10-08 08:55:59

标签: java android time milliseconds

我有三个'长'变量: start,end&原料与材料

long start = 1412801340000         //(means 10/8/14 4:49 PM in UTC time) 
long end= 1412808540000            //(means 10/8/14 6:49 PM in UTC time)

long testtime = 1447195740000      //(means 11/10/15 5:49 PM in UTC time)

我想测试 testtime 中的TIME OF DAY(根本不关心日期,月份和年份)是否在 start 之间结束我怎么能这样做?

基本上,我只想从每个长变量中提取时间,然后检查 testtime 是否介于* start“& end 之间。

5 个答案:

答案 0 :(得分:2)

您可以使用以下代码,只需将毫秒作为日期输入并转换为日期格式

    Date date = new Date(System.currentTimeMillis()); //Input your time in milliseconds
    String yourDesiredDateValue = new SimpleDateFormat("dd MMM yyyy hh:mm a").format(date);

" dd MMM yyyy hh:mm a" ---->你的日期格式

答案 1 :(得分:1)

创建java.util.Date个对象,然后使用Date.getMinutesDate.getHours等进行比较。

请注意,这看起来像一个非常简单的任务,但有一些陷阱,例如夏令时和闰年,当你冒着代码中会遇到一些奇怪错误的风险时。 为避免这种情况,您需要指定时区等。 Calendar类可以为您完成此操作。

我知道我现在为你复杂化了,但是日期和时间错误可能是一个真正的细微差别,特别是因为它们偶尔会弹出来。

答案 2 :(得分:1)

Calendar cStart = Calendar.getInstance();
cStart.setTimeInMillis(start);
Calendar cEnd = Calendar.getInstance();
cEnd.setTimeInMillis(end);
Calendar cTest = Calendar.getInstance();
cTest.setTimeInMillis(testtime);

if(cStart.before(cTest) && cEnd.after(cTest)) {
    // testtime is between start and end
}

答案 3 :(得分:1)

更新 Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。这个答案完整地保留了历史。

LocalTime

假设这些毫秒是自Unix epoch(1970年初)以来的计数,并假设您关心UTC所定义的时间,那么您应该使用Joda-Time或者Java 8中的java.time包。这两个框架都提供了一个LocalTime类来表示没有日期或时区的时间。

约达时间

这是Joda-Time版本2.4中的代码。我们首先从您的long号码获取UTC的日期时间对象,然后转换为仅限时间的值,同时丢失日期和时区信息。

long start = 1412801340000         //(means 10/8/14 4:49 PM in UTC time) 
long end= 1412808540000            //(means 10/8/14 6:49 PM in UTC time)
long testtime = 1447195740000      //(means 11/10/15 5:49 PM in UTC time)

LocalTime startLocalTime = new DateTime( start, DateTimeZone.UTC ).toLocalTime();
LocalTime endLocalTime = new DateTime( end, DateTimeZone.UTC ).toLocalTime();
LocalTime testLocalTime = new DateTime( testtime, DateTimeZone.UTC ).toLocalTime();

boolean isBetween = ( testLocalTime.isAfter( startLocalTime ) ) && ( testLocalTime.isBefore( endLocalTime ) );

在现实生活中,我首先将DateTime实例分配给变量,然后转换为LocalTime对象以便于调试。在这里,紧凑性可以提供更好的演示。

答案 4 :(得分:0)

TL;博士

Interval.of( 
    Instant.ofEpochMilli( 1_412_801_340_000L ) ,  // 2014-10-08T20:49:00Z
    Instant.ofEpochMilli( 1_412_808_540_000L )    // 2014-10-08T22:49:00Z
).contains(
    Instant.ofEpochMilli( 1_447_195_740_000L )    // 2015-11-10T22:49:00Z
)
  

java.time

如果您希望将这些值视为UTC中的日期时间,那么现代方法使用的 java.time 类取代了麻烦的旧Date& Calendar课程。

Instant

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

示例数据错误/歧义

顺便说一句,您的样本计数毫秒 - 从1970年开始 - UTC的日期时间描述不正确。请参阅下面的输出。您似乎有一个影响您的数字的偏移,前两个偏移4小时,最后一个偏移5个小时,可能是由于夏令时(DST)的“后退”变化。这说明为什么追踪时间作为一个从历史算起来是一个如此糟糕的想法,充满了模棱两可和未被捕获的错误的问题。我建议始终使用标准ISO 8601格式将这些时刻序列化为文本。

Instant start = Instant.ofEpochMilli( 1_412_801_340_000L );  // 2014-10-08T20:49:00Z (not 10/8/14 4:49 PM in UTC time)
Instant stop = Instant.ofEpochMilli( 1_412_808_540_000L );   // 2014-10-08T22:49:00Z (not 10/8/14 6:49 PM in UTC time)
Instant test = Instant.ofEpochMilli( 1_447_195_740_000L );   // 2015-11-10T22:49:00Z (not 11/10/15 5:49 PM in UTC time)

code run live at IdeOne.com

  

start.toString():2014-10-08T20:49:00Z

     

stop.toString():2014-10-08T22:49:00Z

     

test.toString():2015-11-10T22:49:00Z

比较

Instant个对象与isBeforeisAfterequals进行比较。

通常,处理时间跨度的最佳方法称为半开放式,其中开头是包含,结尾是独占。因此,例如,一天从一天的第一时刻开始,一直运行到第二天的第一时刻,包括。

boolean isTestWithinRange = 
    ( test.equals( start ) || test.isAfter( start ) )
    &&
    test.isBefore( stop ) 
;

要求“等于或晚于”的较短方式是“不在之前”。

boolean isTestWithinRange = 
    ( ! test.isBefore( start ) )
    &&
    test.isBefore( stop ) 
;

更短的时候,使用org.threeten.extra.Interval项目中的ThreeTen-Extra类,这是一个可以添加到Java项目中的库。不确定这是否适用于Android。

Interval interval = Interval.of( start , stop ) ;
boolean isTestWithinRange = interval.contains( test ) ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

如果JDBC driver符合JDBC 4.2或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql。* classes。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore