2016-11-29 138 views
-3

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

感谢 试图@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分零零秒 新日期:2015-40-25 9时四十分00秒
预期:2015年10月25日9时30分○○秒

  • 通过@Basil布尔克基于下面

    长nanosOfDay = TimeUnit.MILLISECONDS.toNanos(secondsOfDay * 1000);
    本地时间LT = LocalTime.ofNanoOfDay(nanosOfDay); ZoneId z = ZoneId.systemDefault(); ZonedDateTime ZDT = ZonedDateTime.of(A3,A4,Z);

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

    ZonedDateTime ZDT:2015-10-25T09:30-07:00 [美国/洛杉矶]

  • 这是正确的答案:2015-10-25T09:30

    +1

    代码示例。示例输入和预期输出请。 –

    +0

    [java.time.LocalDateTime和java.util.Date之间的转换]的可能重复(http://stackoverflow.com/questions/19431234/converting-between-java-time-localdatetime-and-java-utildate) – Flown

    +0

    目前尚不清楚你有什么。当你说“Date”时,你的意思是'java.util.Date'吗?或者只是“约会”,如果那是什么? *什么是*一天中的毫秒数*意味着什么? – Tunaki

    回答

    0

    东西像:

    Date dt = new Date(System.currentTimeMillis() + ms); 
    or 
    Date otherDate(....); 
    Date dt = new Date(otherDate.getTime() + ms); 
    
    +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

    如果你的数据有没有关于时区信息来了,您的企业风光,你不能安全地假定预期的时区ario,你没有比合并成LocalDateTime对象更好的选择。但请记住,这个值是不明确的。这个值是而不是时间轴上的一个点。该值表示时间线上的潜在点,该点只能由分配给ZonedDateTimetime zone或分配给OffsetDateTimeoffset-from-UTC确定。

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

    关于java.time

    java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

    Joda-Time项目现在位于maintenance mode,建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

    从何处获取java.time类?

    ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore

    +0

    是的,这是确切的答案,适合我。 ZonedDateTime zdt = ZonedDateTime.of(ld,lt,z); –

    相关问题