[英]How to convert 24hr timestring to standard java Date vice versa?
我想有两个功能:
假设我在字符串"11/12/2011"
有日期,时间在字符串中: "0200"
。 我想要一个简单的函数(如果可能的话),它在java中将两个参数(来自上面的日期和时间)转换为Java Date
对象中的11/12/2011 2:00 AM。
假设我有一个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);
}}
LocalDateTime ldt = LocalDateTime.of(
LocalDate.parse(
"11/12/2011" ,
DateTimeFormatter.ofPattern( "mm/DD/uuuu" )
)
,
LocalTime.parse(
"0200" ,
DateTimeFormatter.ofPattern( "HHmm" )
)
)
没有“正常时间”和“军事时间”这样的东西。 这个星球上的大多数人都可以在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
时,您可以提取LocalDate
或LocalTime
。
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
时,您可以提取LocalDate
或ZonedDateTime
。
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 8及更高版本中。 这些类取代了麻烦的旧日期时间类,如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,并进一步适应的Android在ThreeTenABP (见如何使用...... )。
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
试试JodaTime。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.