2016-11-29 135 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); –

    相關問題