簡體   English   中英

如何將24小時的字符串轉換為標准的java日期,反之亦然?

[英]How to convert 24hr timestring to standard java Date vice versa?

我想有兩個功能:

  1. 假設我在字符串"11/12/2011"有日期,時間在字符串中: "0200" 我想要一個簡單的函數(如果可能的話),它在java中將兩個參數(來自上面的日期和時間)轉換為Java Date對象中的11/12/2011 2:00 AM。

  2. 假設我有一個java Date對象作為唯一參數(例如11/12/2011 2:00 AM)從中返回軍事時間(例如“0200”)。

是否有一些java庫或者什么是實現上述目標的最佳方法? 或者是否有一些內置於Java Date中的東西可以讓你在軍事時間內輕松獲得Java日期使用的正常時間?

new SimpleDateFormat("MM/dd/yyyy HHmm").parse("11/12/2011" + " " + "0200");
new SimpleDateFormat("MM/dd/yyyy HHmm").format(new Date());
new SimpleDateFormat("HHmm").format(new Date());

(假設美國的軍隊仍然把月份放在第一個日期)。

[編輯:你也需要擔心你的時區 - 解析它通常最簡單地附加它。 例如:

new SimpleDateFormat("MM/dd/yyyy HHmm Z").parse("11/12/2011" + " " + "0200" + " PST");

(也許軍方總是使用UTC?我不知道......)。 對於格式化,您可以使用setTimezone()在SDF實例上設置時區。

您可以將SimpleDateFormat.parse與適當的格式字符串一起使用。

多數民眾贊成我是怎么做到的

public static String militaryToOrdinaryTime(int milTime)
    {
       int hour = milTime / 100;
       int min = milTime % 100;
       String period;

       if (hour < 0 || hour > 24 || min < 0 || min > 59)
       {
           return "";
       }
       else if (hour > 12)
       {
           hour = hour - 12;
           period = "pm";
       }
       else
       {
           period = "am";
       }
       if (hour == 0)
       {
           hour = 12;
       }
       else if (min == 0)
       {
           String ordTime = hour + " " + period;
           return ordTime;
       }  
       else if (min < 10 && min > 0)
       {
          String min1 = String.valueOf(min);
min1 = "0" + min1;
String ordTime = hour + ":" + min1 + " " + period;
return ordTime;
       }
       String ordTime = hour + ":" + min + " " + period;
       return ordTime;
    }

    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        int time = in.nextInt();

        System.out.println(militaryToOrdinaryTime(time));
    }
}

這就是我做的。

這是我的代碼:

import java.util.Scanner;

class test{
int h,m,s;

public static void main (String args[]){
    int hour,min,sec;
    String format;
    Scanner obj=new Scanner(System.in);
    hour=obj.nextInt();
    min=obj.nextInt();
    sec=obj.nextInt();
    format=obj.next();
    int h,m,s;

    h=((hour>=00&&hour<24)?hour:0);
    m=((min>=00&&min<60)?min:0);
    s=((sec>=00&&sec<60)?sec:0);

    if(format.equals("PM")){
        h= (h!=12? 12+h :h);
    }else if (h==12)h=0;
    System.out.print(h+":"+m+":"+s);

}}

TL;博士

LocalDateTime ldt = LocalDateTime.of( 
    LocalDate.parse( 
        "11/12/2011" , 
        DateTimeFormatter.ofPattern( "mm/DD/uuuu" ) 
    ) 
    , 
    LocalTime.parse( 
        "0200" ,
        DateTimeFormatter.ofPattern( "HHmm" ) 
    )
)

24小時時鍾 “正常”的

沒有“正常時間”和“軍事時間”這樣的東西。 這個星球上的大多數人都可以在12小時的休閑時間和24小時的時間內熟練掌握火車時刻表等重要事項。 “軍事時間”一詞主要用於美國,軍隊以外的人很少有24小時的時間。

避免遺留日期時間類

避免麻煩的舊日期時間類,如java.util.Date.Calendar 現在取代了java.time類。

您有一個僅限日期的值和一個時間值,並且您希望將它們組合在一起。 所以首先建立每個部分。

LocalDate類表示沒有時間且沒有時區的僅日期值。 同樣, LocalTime類表示沒有日期且沒有時區的時間。

LocalDate

您可以指定顯式格式設置模式。

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern( "mm/DD/uuuu" ).withLocale( Locale.US );
LocalDate ld = LocalDate.parse( "11/12/2011" , dateFormatter );

ld.toString():2011-01-12

LocalTime

並為時間做同樣的事情。

DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern( "HHmm" );
LocalTime lt = LocalTime.parse( "0200" , timeFormatter );

lt.toString():02:00

LocalDateTime

將這兩部分加入LocalDateTime

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

LocalDateTime 並不代表實際的時刻,在時間軸上的一個點。 沒有偏離UTC或時區的上下文,此對象沒有實際意義。 新西蘭奧克蘭的凌晨2點,比加爾各答的凌晨2點早幾個小時,早於凌晨2點在巴黎FR,早些時候凌晨2點在加利福尼亞州蒙特利爾。

LocalDateTime ,當您再次想要問題中所請求的僅限日期或僅限時間的LocalTime時,您可以提取LocalDateLocalTime

LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();

ZonedDateTime

如果您知道此值的UTC偏移量 ,請應用ZoneOffset以獲取OffsetDateTime 更好的是,使用時區(如果已知), ZonedId可以獲得ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );

zdt.toString():2011-01-12T02:00:00-05:00 [美國/蒙特利爾]

ZonedDateTime ,當您再次想要問題中所請求的僅限日期或僅限時間的LocalTime時,您可以提取LocalDateZonedDateTime

LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();

轉變

最好避免像瘟疫這樣的java.util.Date 但是,如果必須使用尚未更新為java.time類型的舊代碼,則可以通過調用添加到舊類的新方法來轉換為/從java.time轉換。 ZonedDateTime您可以提取java.time.Instant (UTC時間軸上的時刻)並將其提供給Date上的靜態方法。

java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );

有關更多轉換信息,請參閱將java.util.Date轉換為“java.time”類型?

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,如java.util.Date.Calendarjava.text.SimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的AndroidThreeTenABP (見如何使用...... )。

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM