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

SimpleDateFormat在分析过程中返回错误的时区

司空锋
2023-03-14
Date punchDate = null;
Date punchTime = null;

SimpleDateFormat sdfDate = new SimpleDateFormat("dd.MM.yyyy");
SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");

    try
    {
        sdfDate.setTimeZone(TimeZone.getTimeZone("UTC"));
        sdfTime.setTimeZone(TimeZone.getTimeZone("UTC"));
        punchDate = sdfDate.parse(arg1);
        punchTime = sdfTime.parse(arg2);
    }
    catch (ParseException pe)
    {
        System.out.println("Parse exception " +pe.getMessage());
    }

我的需求基本上是,我需要从字符串输入创建一个日期对象,但时区应该保持UTC。

共有1个答案

太叔经赋
2023-03-14

我需要从字符串输入创建一个Date对象,但时区应该保持UTC。

LocalDate.parse( 
    "23.01.2017" , 
    DateTimeFormatter.ofPattern( "dd.MM.uuuu" ) 
) 

…还有…

LocalTime.parse( "12:34:56" ) 

…结合…

OffsetDateTime.of( datePart , timePart , ZoneOffset.UTC )
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd.MM.uuuu" ) ;
LocalDate ld = LocalDate.parse( "23.01.2017" , f ) ;
LocalTime lt = LocalTime.parse( "12:34:56" ) ;
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;

如果希望看到与特定区域挂钟时间相同的时刻,请应用ZoneId以获得ZonedDateTime

大陆/地区格式指定适当的时区名称,例如美国/蒙特利尔非洲/卡萨布兰卡太平洋/奥克兰。切勿使用estist等3-4个字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;  // Same simultaneous moment, same point on the timeline.

提示:要将这种数据交换为文本,请专门使用标准的ISO 8601格式。这些格式被合理地设计成无歧义,易于机器处理,并且易于被人们跨多种文化阅读。

String output = Instant.now().toString() ;  

instant类以UTC表示时间线上的一个时刻,分辨率为纳秒(最多为十进制分数的九(9)位)。

通过调用ToStringOffsetDateTime中提取Instant对象。

Instant instant = odt.toInstant() ;
java.util.Date date = Date.fromInstant( instant ) ;

…走另一条路…

Instant instant = myJavaUtilDate.toInstant() ;
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;  

要了解更多信息,请参阅Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR310。

从哪里获取java.time类?

  • Java SE 8、Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9添加了一些小功能和修补程序。
      null
      null

 类似资料:
  • 我想解析这个字符串:Thu Jan 01 00:00:58 CET 1970 堆栈跟踪: java.text.ParseException:不可解析的日期:“Thu Jan 01 00:01:18 CET 1970”(偏移量20处)w/system.err:at java.text.DateFormat.Parse(DateFormat.java:571) 系统环境:android studio

  • 问题内容: 谁能告诉我这段代码有什么问题: 输出是: 当输入时间以毫秒为单位时,请注意以分钟为单位的差异。 问题答案: 对于,毫秒格式的值包含大写字符,而不是秒的小写字符。 秒(秒)55 毫秒数978 它解释为秒,并将这些秒(847秒是13分钟47秒)添加到您的值中。 使用毫秒。 顺便说一句,如果相同,则无需多次创建。您可以创建一次,将其保存到变量中,然后多次调用,对于您要解析的每个日期/时间字符

  • 问题内容: 我一直在尝试隔离应用程序中的错误。我成功产生了以下“谜语”: 在Android API 7上 运行此代码时,我得到了注释中的值(是的,是的)。此行为取决于特定的Java实现。 我的问题是: 为什么s1不等于s2? 更重要的是, 为什么s1不正确? 虽然指向适当的时间点,但没有。Android的SimpleDateFormat实现中似乎存在一个错误。 问题1 的答案 : 请参阅Balus

  • Apache-cxf wsdlvalidator返回 wsdl文档示例来自:https://github.com/wso2/wso2-axis2/blob/master/modules/xmlbeans/test-resources/mime-doc.wsdl。(我还尝试了其他例子) 如果将“mime:part”更改为“part”,验证器将返回错误: WSDLValidator错误:javax.w

  • 我使用以下源代码创建了自己的SDF模式:https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/text/simpledateformat.html 导致以下错误,我不明白原因: 任何帮助都会很棒! 编辑:我正在使用JDK 13 进程结束,退出代码为%1

  • 我写了一个二分搜索的递归程序,正如你所看到的,我试图在给定的数组中找到目标=21的位置,然后返回位置为2。但是,我的输出是1。当我调试它匹配att arr[start]=target时,它直接跳到findTheNumber(arr,mid+1,end,target)行;然后下一行,然后返回mid..只是想知道为什么我的返回在“返回开始”时中断了 }