当前位置: 首页 > 知识库问答 >
问题:

LocalTime解析方法在与DateTimeFormaster一起使用时抛出错误

古扬
2023-03-14

基本上,我想将格式为“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对象,我只是可以实现它,因为错误出现了,

如果有人能帮忙就好了,干杯!

共有2个答案

孟跃
2023-03-14

如上面的链接所述,您需要用您选择的模式将时间格式化成字符串。请注意,< code>hh对应于12小时制时间(即AM/PM时间),因此,您应该将< code>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
郤旭东
2023-03-14
ZonedDateTime
.now(
    ZoneId.of( "Asia/Tokyo" )
)
.toLocalTime()

或者只是:

LocalTime.now( ZoneId.of( "Asia/Tokyo" ) )

您的问题包括:

    < li >您的格式模式< code>hh:mm与您输入的< code>15:32:03.824不匹配。 < li> hh:mm使用了错误的代码。< code>hh表示12小时制,但您输入的显然是24小时制。

您的输入格式在一天中的某个时间符合ISO 8601标准。

java。时间类在解析/生成文本时默认使用标准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中的类的智能对象。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 ) ;
 类似资料:
  • 问题内容: 我正在为接下来的2个月内的OCPJP 8考试做准备,目前我受到了我的关注,因为我不明白为什么 这显然要编译OK!但是当您运行它时,您会看到这样的异常 我在这里需要一些帮助,以了解为什么asList方法不能与removeIf一起使用?我假设它将返回一个实现removeIf方法的ArrayList实例! 任何答案将不胜感激。 干杯! 问题答案: 生成一个列表,从该列表中无法删除元素,因此引

  • 我使用的Android MediaExtractor是这样的: 输入缓冲区由配置为AAC编码器的MediaCodec提供。目标是将wave文件转换为aac。当然,上面的代码是缩写的,但我一直跟踪到最后一行。 它也仅在将MediaExtractor与wav文件一起使用时发生。例如,我使用了一个。m4a,一切正常。 MediaExtractor的文档显示: MediaExtractor有助于从数据源中

  • 在嵌入式TomEE容器中运行Arquillian测试时,我得到了以下错误

  • 我的适配器 我的持有者 类myHolder(itemView:View):recyclerview.viewholder(itemView){} 第二个 提前致谢

  • 问题内容: 我设法解析一个对象: 但是我不能对。这段代码: 抛出: 我究竟做错了什么? 问题答案: 如果您使用特定格式,请按照API进行操作: 该字符串必须代表有效时间,并使用进行解析。 24小时必须 或持续12h 处理的格式必须具有以下条件: 一天中的两位数字。这将预先填充零以确保两位数。 冒号 分钟数字为两位数。这将预先填充零以确保两位数。 如果分钟不可用,则格式完成。 冒号 分钟为两位数。这

  • 我最近开始使用JMockit,对TDD和mocking非常陌生。我喜欢使用代码覆盖率来确保我已经测试了给定类/方法的所有行。 我在尝试JMockit(Delegate()功能)和代码覆盖率时遇到了以下错误。我包括通过和不通过的考试。 我不确定我是否做错了什么? 我想知道是否有其他人遇到过此问题,是否有任何解决方案或修复可用? 我甚至不确定这是JMockit问题还是EclEmma问题。谢谢 我的设置