Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的用户定义日期时间输入_Java_Datetime_Calendar_Date Difference - Fatal编程技术网

java中的用户定义日期时间输入

java中的用户定义日期时间输入,java,datetime,calendar,date-difference,Java,Datetime,Calendar,Date Difference,我想以下面的格式输入日期和时间,需要计算两者之间的时差,有人能建议如何以下面的字符串作为输入并计算时差吗 java中的用户定义日期时间输入 String startTime= "11/27/2018+09:00:00"; String endTime= "11/28/2018+13:00:00"; +是一个分隔符(不是加号或减号)。在Java8中有: LocalDateTime:如果需要处理日期和时间,请使用此选项。 LocalDate:如果只需要处理日期,请使用此选项。 ZonedDateT

我想以下面的格式输入日期和时间,需要计算两者之间的时差,有人能建议如何以下面的字符串作为输入并计算时差吗

java中的用户定义日期时间输入

String startTime= "11/27/2018+09:00:00";
String endTime= "11/28/2018+13:00:00";
+
是一个分隔符(不是加号或减号)。

在Java8中有:
LocalDateTime
:如果需要处理日期和时间,请使用此选项。
LocalDate
:如果只需要处理日期,请使用此选项。
ZonedDateTime
:如果您需要使用时区处理日期时间,请使用此选项。
OffsetDateTime
:如果需要使用offset处理日期时间,请使用此选项。(最适合您的情况)

您的情况是只使用日期和偏移量,这有点棘手,因为时区和偏移量只能应用于LocalDateTime(而不仅仅是日期)

不过,我想你可以这样解决:

创建一个将日期字符串转换为
OffsetDateTime
的方法,如下所示:

private static OffsetDateTime createZonedDateTime (String dateWithTimeOffset)
{
    //TODO: assert that dateWithTimeOffset is valid
    String date = dateWithTimeOffset.substring (0, 10);
    String timeOffset = dateWithTimeOffset.substring (10, 13);

    //define your date pattern
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("MM/dd/yyyy");

    return LocalDate.parse (date, formatter) // create LocalDate
                .atStartOfDay () // convert it to LocalDateTime with time 00:00:00
                .atOffset (ZoneOffset.of(timeOffset)); // apply the offset
}
Duration duration = Duration.between (startTime, endTime);
然后您可以像这样简单地创建
OffsetDateTime

OffsetDateTime startTime = stringToZonedDateTime ("11/27/2018+09:00");  
OffsetDateTime endTime = stringToZonedDateTime ("11/28/2018+13:00");
您可以使用
OffsetDateTime
创建持续时间,如下所示:

private static OffsetDateTime createZonedDateTime (String dateWithTimeOffset)
{
    //TODO: assert that dateWithTimeOffset is valid
    String date = dateWithTimeOffset.substring (0, 10);
    String timeOffset = dateWithTimeOffset.substring (10, 13);

    //define your date pattern
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("MM/dd/yyyy");

    return LocalDate.parse (date, formatter) // create LocalDate
                .atStartOfDay () // convert it to LocalDateTime with time 00:00:00
                .atOffset (ZoneOffset.of(timeOffset)); // apply the offset
}
Duration duration = Duration.between (startTime, endTime);
持续时间将您需要的一切与持续时间相关,例如:

duration.toHours () // will give you the hour duration
无意义的输入 这些输入没有意义。将诸如
+09:00
之类的日期应用于诸如
11/27/2018
之类的日期没有任何意义

要使偏移有意义,需要日期和时间

我们可以猜测,假设发送数据的人是指一天中的第一刻。如果是这样的话,他们应该在数据中包含这一点

这里的诀窍是,某些时区的某些日期并不总是从一天中的00:00:00开始。异常情况,如“平均一天”可能从01:00:00开始。不幸的是,您的输入只有一个(小时分秒数)而不是一个时区(
大陆/地区
名称)。A是特定地区人民使用的补偿的过去、现在和未来变化的历史。如果没有时区,我们就无法通过查找规则来了解异常情况

你所能做的就是假设一天从00:00:00开始,忽略任何异常的现实。但这是猜测,是不可取的。真正的解决方案是,在交换日期-时间值时,向数据发布者传授两件事:(a)使用UTC而不是偏移量或区域;(b)以标准格式编写字符串

猜测 如果纠正这些数据的来源是不可行的,那么我们可以继续猜测

提取日期,与偏移量分开

String input = "11/27/2018+09:00";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" );
LocalDate localDate = LocalDate.parse( input.substring( 0 , 10 ) , f );
ZoneOffset zoneOffset = ZoneOffset.of( input.substring( 11 ) );
localDate.toString():2018-11-27

zoneOffset.toString():+09:00

2018-11-27T00:00+09:00

我们可以将经过的时间计算为持续时间。但请注意,如果没有时区的背景,我们无法解释在这段时间内可能发生的任何异常情况,如上所述。仅使用偏移而不是分区,使用通用的24小时工作日进行计算。因此,这只是草率的猜测,不是一个可靠的解决方案

Duration d = Duration.between( odt , odtLater ) ; 

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

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

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

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(
      DateTimeFormatter
      Duration
      java.time
      api中搜索1)控制台中的java输入字符串2)java解析字符串到日期3)LocalDate与Roopesh之间的java差异您自己尝试过什么吗?这种情况下的预期结果是什么?抱歉,由于我在您的输入中看不到一天中的任何时间,因此无法立即清除。20小时?24小时?一天?欢迎使用堆栈溢出。@Ole感谢您纠正我的错误,实际上格式是“MM/DD/YYYY+09:00:00”+是字符串分隔符。@karthik我尝试了另一种方法,占用系统时间并计算差异,我不希望该程序由其他人完成,我只想知道如何实现。@BasilBourque,谢谢你的意见。我已经更新了我的答案。感谢您指出我以前没有意识到这一点。