Java如何添加时间和日期

时间:2016-11-29 19:48:36

标签: datetime java-8

使用JDK 1.8 我有一天的时间(不是自1970年以来),我有一个日期如何添加这两个并创建一个日期时间。

由于 尝试@Kikos soln无法产生正确的结果: 不知何故,我的原始时间930小时在这种情况下变为9:40,原始日期本身不应该有任何时间获得时间(??) - 所以加法数学失败。

   String testdate = "2015/10/25";
    Date date = new SimpleDateFormat("yyyy/mm/dd").parse(testdate);

    String timehrs= "930";
    long ltime = Long.parseLong("930");
    long hoursAsSeconds = (ltime / 100) * 60 * 60;
    long minsAsSeconds = (ltime % 100) * 60;
    long secondsOfDay = hoursAsSeconds + minsAsSeconds;

    System.out.println("testdate : "+ testdate +", timehrs: "+timehrs+" ,secondsOfDay: "+secondsOfDay); 
    System.out.println("Orig Date time formatted: "+ new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(date));

    Date dt = new Date(date.getTime() + secondsOfDay*1000);

    System.out.println("New Date : "+ new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(dt);  

testdate:2015/10/25,timehrs:930,secondsOfDay:34200 原始日期时间格式:2015-10-25 12:10:00 新日期:2015-40-25 09:40:00
预计:2015-10-25 09:30:00

  1. 基于下面的@Basil Bourque

    long nanosOfDay = TimeUnit.MILLISECONDS.toNanos(secondsOfDay * 1000);
    LocalTime lt = LocalTime.ofNanoOfDay(nanosOfDay); ZoneId z = ZoneId.systemDefault(); ZonedDateTime zdt = ZonedDateTime.of(ld,lt,z);

    System.out.println(“ZonedDateTime zdt:”+ zdt);

    ZonedDateTime zdt:2015-10-25T09:30-07:00 [America / Los_Angeles]

  2. 这是正确答案: 2015-10-25T09:30

2 个答案:

答案 0 :(得分:1)

问题很复杂

你说你的时间是从午夜开始的毫秒数(显然)。但930表示时间00:00:00.930,而不是09:30:00,如示例数据所示。我会按照您的文字而不是您的示例数据。

java.time

你正在使用麻烦的旧日期时间类,现在是旧的,取而代之的是java.time类。忘了你曾经听说过java.util.Date.Calendar

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

ISO 8601

在解析/生成表示日期时间值的字符串时,java.time类默认使用ISO 8601标准。要使输入字符串成为标准,请将这些斜杠字符替换为连字符。

String input = "2015/10/25".replace( "/" , "-" );
LocalDate ld = LocalDate.parse( input );

顺便说一下,你被分配的整个方案很笨拙,容易出错,并且不必要地复杂化。要序列化系统之间通信的日期时间值,请使用ISO 8601字符串格式。

LocalTime

你说你有一个毫秒数来表示从午夜算起的时间。

LocalTime类提供工厂方法,根据整秒和of nanoseconds的持续时间进行实例化。要获得纳秒,只需将您的毫秒乘以一千。更好的是,让TimeUnit enum完成工作,让你的代码更加自我记录。

long millisOfDay = Long.parseLong( "930" );
long nanosOfDay = TimeUnit.MILLISECONDS.toNanos( millisOfDay );  // Same effect as: ( millisOfDay * 1_000L )
LocalTime lt = LocalTime.ofNanoOfDay( nanosOfDay );

ZonedDateTime

现在将这两个Local…对象与时区结合起来,以确定时间轴上的一个点。这个日期和时间是在魁北克蒙特利尔,法国巴黎,印度加尔各答还是新西兰奥克兰的一个时刻?

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z );

请参阅live code in IdeOne.com

  

ld.toString():2015-10-25

     

lt.toString():00:00:00.930

     

zdt.toString():2015-10-25T00:00:00.930 + 13:00 [太平洋/奥克兰]

LocalDateTime

如果您的数据没有关于时区的信息,并且您无法安全地假设业务场景的预期时区,那么除了合并到LocalDateTime对象之外,没有其他选择。但请记住,这个值是模棱两可的。此值时间轴上的一个点。此值表示时间轴上的潜在点,只能通过为time zone分配的ZonedDateTimeoffset-from-UTC分配的OffsetDateTime来确定。< / p>

LocalDateTime ldt = LocalDateTime.of( ld , lt );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

类似的东西:

Date dt = new Date(System.currentTimeMillis() + ms);
or
Date otherDate(....);
Date dt = new Date(otherDate.getTime() + ms);