Java 使用自定义时间获取当前日期
我有一些时间Java 使用自定义时间获取当前日期,java,android,date,datetime,Java,Android,Date,Datetime,我有一些时间字符串,例如“09:00”和“17:30”,我需要检查当前时间是否在该范围内 我想我可以做一个比较: SimpleDateFormat format = new SimpleDateFormat("HH:mm"); Date now = new Date(); Date begin; Date end; begin = format.parse(begin_string); end = format.parse(end_string); if (now.compareTo(beg
字符串
,例如“09:00”
和“17:30”
,我需要检查当前时间是否在该范围内
我想我可以做一个比较:
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date now = new Date();
Date begin;
Date end;
begin = format.parse(begin_string);
end = format.parse(end_string);
if (now.compareTo(begin) > 0 && end.compareTo(now) > 0)
return true;
else
return false;
结果表明,当我解析字符串时,时间被正确解析,但日期被设置为1970年1月1日。这样,代码将始终返回false
我想知道如何将开始
和结束
设置为当前日期,但要使用字符串中的时间。- 获取当前时间,
Calendar.getInstance()代码>
- 获取另外两个当前时间实例,并根据输入设置时间字段
Calendar.set(Calendar.HOUR_OF_DAY, 1);
- 并在时间范围内调用
compare()
- 获取当前时间,
Calendar.getInstance()代码>
- 获取另外两个当前时间实例,并根据输入设置时间字段
Calendar.set(Calendar.HOUR_OF_DAY, 1);
- 并在时间范围内调用
compare()
- 你真的应该使用。然后,您可以根据从字符串解析的值单独设置小时和分钟。然后获取以毫秒为单位的时间,并进行比较
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
long time = cal.getTimeInMillis();
你也可以使用这个奇妙的图书馆。在我看来,Joda是处理日期和时间的一种更好的方法。你真的应该使用。然后,您可以根据从字符串解析的值单独设置小时和分钟。然后获取以毫秒为单位的时间,并进行比较
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
long time = cal.getTimeInMillis();
你也可以使用这个奇妙的图书馆。在我看来,Joda是处理日期和时间的一种更好的方法。您也可以像这样重用当前时间的format对象:
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date now = new Date();
String time = format.format(now); // format to wall time loosing current date
System.out.println(time);
now = format.parse(time); // reparse wall time
System.out.println(now);
因此,您可以隐式使用系统的标准时区将now
转换为1970,然后可以使用它与begin
和end
进行直接比较
Date begin = format.parse("09:00");
Date end = format.parse("21:30");
return (begin.before(now) && end.after(now)); // open-bounded interval
您也可以像这样在当前时间重复使用format对象:
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date now = new Date();
String time = format.format(now); // format to wall time loosing current date
System.out.println(time);
now = format.parse(time); // reparse wall time
System.out.println(now);
因此,您可以隐式使用系统的标准时区将now
转换为1970,然后可以使用它与begin
和end
进行直接比较
Date begin = format.parse("09:00");
Date end = format.parse("21:30");
return (begin.before(now) && end.after(now)); // open-bounded interval
捆绑的java.util.Date和.Calendar类是出了名的麻烦。避开它们。使用Java 8中的库或新发现的库(受Joda Time的启发,由JSR 310定义) 如果您确实不关心时区或日期,请使用类或类 警告:天真的程序员通常认为他们只需要本地时间,因此可以忽略时区,但他们会后悔自己的处境 乔达时间 如果时间的格式正确(24小时,正确的位数),则可以直接将字符串输入传递给LocalTime的构造函数,而无需费心解析。该类有一个内置的ISO8601风格的解析器
String inputStart = "09:00";
String inputStop = "17:30";
LocalTime start = new LocalTime( inputStart );
LocalTime stop = new LocalTime( inputStop );
LocalTime now = LocalTime.now();
// Comparing using Half-Open logic, where beginning is inclusive and ending is exclusive.
boolean isNowContainedWithinInterval = ( ( now.isEqual( start ) ) || ( now.isAfter( start ) ) ) && ( now.isBefore( stop ) );
转储到控制台
System.out.println( "start: " + start );
System.out.println( "stop: " + stop );
System.out.println( "now: " + now );
System.out.println( "isNowContainedWithinInterval: " + isNowContainedWithinInterval );
当运行时
start:09:00:00.000
车站:17:30:00.000
现在:12:42:06.567
现在包含在Interval中:true
在现实世界中,我会添加一个断言测试,证明停止时间晚于开始时间,以验证输入。捆绑的java.util.Date和.Calendar类是出了名的麻烦。避开它们。使用Java 8中的库或新发现的库(受Joda Time的启发,由JSR 310定义) 如果您确实不关心时区或日期,请使用类或类 警告:天真的程序员通常认为他们只需要本地时间,因此可以忽略时区,但他们会后悔自己的处境 乔达时间 如果时间的格式正确(24小时,正确的位数),则可以直接将字符串输入传递给LocalTime的构造函数,而无需费心解析。该类有一个内置的ISO8601风格的解析器
String inputStart = "09:00";
String inputStop = "17:30";
LocalTime start = new LocalTime( inputStart );
LocalTime stop = new LocalTime( inputStop );
LocalTime now = LocalTime.now();
// Comparing using Half-Open logic, where beginning is inclusive and ending is exclusive.
boolean isNowContainedWithinInterval = ( ( now.isEqual( start ) ) || ( now.isAfter( start ) ) ) && ( now.isBefore( stop ) );
转储到控制台
System.out.println( "start: " + start );
System.out.println( "stop: " + stop );
System.out.println( "now: " + now );
System.out.println( "isNowContainedWithinInterval: " + isNowContainedWithinInterval );
当运行时
start:09:00:00.000
车站:17:30:00.000
现在:12:42:06.567
现在包含在Interval中:true
在现实世界中,我会添加一个断言测试,证明停止时间晚于开始时间,以验证输入。但这样我必须手动解析字符串以获得小时和分钟,然后设置日历?您可以使用
SimpleDateFormat
进行解析,但这样我必须手动解析字符串以获取小时和分钟,然后设置日历?您可以使用SimpleDateFormat
进行解析起初我认为这是一个不雅观的解决方案,但事实证明它很容易理解和使用。@Guillerme是的,使用java.util.Date
通常不是很优雅,但至少这段代码解决了所有的陷阱(您甚至可以在format对象上显式设置时区)。其他库,如JodaTime、JSR-310(Java8)或my library有一种特殊类型的LocalTime
,这会更好。起初我认为这是一种不雅观的解决方案,但事实证明它很容易理解和使用。@Guillerme是的,使用java.util.Date
通常不是很优雅,但至少这段代码解决了所有的陷阱(您甚至可以在format对象上显式设置时区)。其他库,如JodaTime、JSR-310(Java8)或my library,都有一个特殊的类型LocalTime
,这会更好。