Java 如何将毫秒转换为一天中的时间?

Java 如何将毫秒转换为一天中的时间?,java,android,time,milliseconds,Java,Android,Time,Milliseconds,我有三个“长”变量:开始、结束和测试时间 我想测试testtime中的时间(根本不关心日期、月份和年份)是否介于开始和结束之间。我该怎么做 基本上,我只想从每个长变量中提取一天中的时间,然后检查testtime是否介于*start“&end.创建java.util.Date对象,然后使用Date.getMinutes和Date.getHours等进行比较 请注意,这看起来是一项非常简单的任务,但也存在一些陷阱,例如夏时制和闰年,风险在于您的代码中会遇到一些奇怪的错误。 为了避免这种情况,您需要指

我有三个“长”变量:开始、结束和测试时间

我想测试testtime中的时间(根本不关心日期、月份和年份)是否介于开始和结束之间。我该怎么做


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

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

请注意,这看起来是一项非常简单的任务,但也存在一些陷阱,例如夏时制和闰年,风险在于您的代码中会遇到一些奇怪的错误。 为了避免这种情况,您需要指定时区等。Calendar类可以为您完成这项工作


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

创建
java.util.date
对象,然后使用
date.getMinutes
date.getHours
等进行比较

请注意,这看起来是一项非常简单的任务,但也存在一些陷阱,例如夏时制和闰年,风险在于您的代码中会遇到一些奇怪的错误。 为了避免这种情况,您需要指定时区等。Calendar类可以为您完成这项工作


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

你可以像下面这样使用代码,只需将千分之一秒作为日期的输入,并转换为日期格式

    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”——>您的日期格式

您可以像下面这样使用代码,只需将千秒作为日期的输入,并转换为日期格式

    Date date = new Date(System.currentTimeMillis()); //Input your time in milliseconds
    String yourDesiredDateValue = new SimpleDateFormat("dd MMM yyyy hh:mm a").format(date);
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
}

“dd-MMM-yyyy-hh:mm-a”——>您的日期格式

更新:项目现在开始,团队建议迁移到课程。这个答案在历史上保持不变

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
}
LocalTime
假设这些毫秒是自(1970年初)以来的计数,并且假设您关心由定义的一天中的时间,那么您应该使用java 8中的或java.time包。这两个框架都提供了一个类来表示一天中没有日期或时区的时间

乔达时间 以下是Joda Time version 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 ) );

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

更新:项目现在开始,团队建议迁移到类。这个答案在历史上保持不变

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

乔达时间 以下是Joda Time version 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 ) );
在现实生活中,我会首先将实例分配给一个变量,然后再转换为
LocalTime
对象以便于调试。在这里,紧凑性有助于更好的演示。

tl;dr 假的

java.time

如果您希望将这些值视为UTC中的日期时间,那么现代方法使用Java.Times类来取代麻烦的旧代码>日期<代码>和<代码>日历> /Cord>类。< /P>

Instant
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

样本数据错误/歧义 顺便说一句,您对自1970年UTC开始以来的样本计数(毫秒)的日期时间描述不正确。请参阅下面的输出。您似乎有一个偏移量影响您的数字,前两个偏移量为4小时,后一个偏移量为5小时,这可能是由于夏时制(DST)的“后退”更改所致。这说明了为什么从历元开始跟踪时间是一个糟糕的主意,充满了歧义和未捕获错误的问题。我建议始终使用标准格式将这些时刻序列化为文本

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)
你看

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

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

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

比较 将
Instant
对象与
isBefore
isAfter
相等的对象进行比较

一般来说,处理时间跨度的最佳方法称为半开放式,其中开始是包容性的,结束是排他性的。因此,例如,一天从一天的第一个时刻开始,一直到但不包括第二天的第一个时刻

boolean isTestWithinRange = 
    ( test.equals( start ) || test.isAfter( start ) )
    &&
    test.isBefore( stop ) 
;
较短的提问方式“等于或晚于”is“is not before”

更简短的是,使用项目中的类,一个可以添加到Java项目中的库。不确定这在Android中是否有效

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

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

使用符合或更高版本的,您可以直接与数据库交换java.time对象。不需要字符串或java.sql.*类

从哪里获得java.time类

  • ,及以后