基本上,我想将格式为"hh:mm"的DateTimeFormatter应用于我从'zonedDateTime.toLocalTime(('对象获得的值,并将其存储为LocalTime对象,这样我就可以获得像"08:00"这样的值,下面的代码显示了我如何获得特定时区的当前时间,我试图在格式化它时将其转换为名为"currentTime"的LocalTime:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm");
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of(appTheme.getTimezone()));
LocalTime currentTime = LocalTime.parse(zonedDateTime.toLocalTime().toString(),formatter);
现在,由于某种未知的原因,我从上面的最后一行代码中得到了以下错误:
java.time.format.DateTimeParseException: Text '15:32:03.824' could not be parsed, unparsed text found at index 5
java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1952)
java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
java.time.LocalTime.parse(LocalTime.java:441)
io.apptizer.cafe.controller.CategoryController.getBusinessCategoryDetails(CategoryController.java:789)
io.apptizer.cafe.controller.CategoryController.backwardCompatibilityCategories(CategoryController.java:387)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
io.apptizer.cafe.filter.SessionHandleFilter.doFilter(SessionHandleFilter.java:39)
我希望我能很好地解释我的问题,我的主要目标是获得"hh:mm"或"hh:mm"格式的"zonedDateTime.toLocalTime(("值,并将其存储为LocalTime对象,我只能实现它,因为出现了错误,
如果有人能帮忙就好了,干杯!
tl;dr
ZonedDateTime
.now(
ZoneId.of( "Asia/Tokyo" )
)
.toLocalTime()
或者只是:
LocalTime.now( ZoneId.of( "Asia/Tokyo" ) )
详细信息
您的问题包括:
- 您的格式模式
hh:mm
与您的输入15:32:03.824
不匹配 hh:mm
使用了错误的代码。hh
表示12小时时钟,但您的输入显然是24小时时钟
ISO 8601
您的输入格式在一天中的某个时间符合ISO 8601标准。
LocalTime
在解析/生成文本时,java.time类默认使用标准ISO 8601格式。因此,无需指定格式化模式。只是作为LocalTime
对象进行解析。
LocalTime lt = LocalTime.parse( "15:32:03.824" ) ;
你更大的目标还不清楚,但我怀疑你希望在特定的时区看到当前的时间。如果是,只需在经过时区时使用LocalTime.now
即可。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalTime lt = LocalTime.now( z ) ;
如果您有一个表示为ZonedDateTime
的时刻,只需调用toLocalTime
即可提取LocalTime
对象。
LocalTime lt = myZonedDateTime.toLocalTime() ;
提示:你似乎只在思考字符串操作。思考而不是学习和使用行业领先的java.time框架中的类的智能对象,该框架构建在java 8及更高版本中。请免费参阅Oracle的Java教程。请注意上面的代码是如何不使用字符串来完成其工作的。
截断
你说:
这样我就可以得到像"08:00"、这样的值
如果您的意思是要将分钟和秒清零,请截断。
LocalTime lt = LocalTime.now( ZoneId.of( "America/Edmonton" ) ).truncatedTo( ChronoUnit.HOURS ) ;
数据库
您评论道:
我需要将从'zonedDateTime.toLocalTime(('获得的值存储为'HH:mm'或'HH:mm'格式的LocalTime对象
如果您的意思是存储在数据库中,那么您的数据库表应该定义为类似于SQL标准类型TIME
的类型,而不是文本类型。然后通过JDBC 4.2或更高版本传递LocalTime
对象。
myPreparedStatement.setObject( … , lt ) ;
检索。
LocalTime lt = myResultSet.getObject( … , LocalTime.class ) ;
您评论道:
我将使用多个LocalTime值进行时间范围比较
使用一对带有JDBC的LocalTime
对象来查询类型为TIME
的列。例如,让我们查找标记为午餐时间的行。
LocalTime start = LocalTime.NOON ;
LocalTime end = LocalTime.of( 13 , 0 ) ;
SQL看起来是这样的,其中?
是一个占位符,表示要作为准备语句的一部分替换的值。
SELECT *
FROM some_table_
WHERE time_of_day_ !< ?
AND time_of_day_ < ?
;
注意!<
,意思是";不小于";,是一种较短的提问方式;等于或大于";。
Java代码是:
myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , end ) ;
您不能创建格式化的日期-时间对象
如上面链接中所述,您需要使用您选择的模式将时间格式化为字符串。请注意,hh
对应于12小时时间(即AM/PM时间(,因此,您应该将a
与之一起使用。有关更多详细信息,请查看文档。
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter formatter24Hour = DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH);
DateTimeFormatter formatterAmPm = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.systemDefault());
LocalTime localTime = zonedDateTime.toLocalTime();
String currentTime24HourFormat = formatter24Hour.format(localTime);
String currentTime12HourFormat = formatterAmPm.format(localTime);
System.out.println(currentTime24HourFormat);
System.out.println(currentTime12HourFormat);
}
}
输出:
21:40
09:40 PM