繁体   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