从字符串创建Java日期,反之亦然

我有一个Integer formatdate (YYYYMMDD) 。 并将start_time作为String (HH:mm 24小时制) 。 以及以小时为单位的time_duration

 int date = 20140214; String start_time = "14:30"; double duration = 50.30; 

我想使用这3个值并创建2个Java Date Objects。 一个是start_date ,一个是end_date 。 它们的格式应为YYYY-MM-DD HH:mm

然后我得到2个数据字符串,如YYYY-MM-DD HH:mm 。 我怎样才能获得那些先前的变量。 datestart_timeduration

这是我的尝试。

 public void solve() throws IOException { int date = 20140214; String start_time = "14:30"; double duration = 24.50; String startDate = ""; DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); startDate = getDate(date) + " " + start_time; try { Date start_Date = df.parse(startDate); Date end_Date = new Date(start_Date.getTime()+(int)(duration*3600*1000)); System.out.println(df.format(start_Date)); System.out.println(df.format(end_Date)); } catch (ParseException ex) { } } public String getDate(int dateInt) { String date = ""; String dateIntString = String.valueOf(dateInt); date = date + dateIntString.substring(0, 4) + "-"; date = date + dateIntString.substring(4, 6) + "-"; date = date + dateIntString.substring(6, 8); return date; } 

有没有简单的方法来做到这一点。 ? 还是我可以使用的一些内置function,而不是我使用过的function?

日期时间的奇怪数据类型

使用:

  • 一个int,表示日历日期的数字
  • 表示时间数字的字符串
  • 表示小时数持续时间的双精度数

……都是不寻常的方法。 处理日期时间值可能不是最明智的选择。

避免使用java.util.Date/Calendar

知道捆绑的类java.util.Date和.Calendar是众所周知的麻烦,应该避免。 在Java 8中使用Joda-Time或新的java.time。*包 ( 教程 )。 并熟悉方便的ISO 8601标准。

时区

您的问题和示例忽略了时区的关键问题。 处理没有时区的日期时间数据就像处理文本文件而不知道它们的字符编码。 不好。

使用适当的时区名称来创建时区对象。 避免使用非标准的3字母代码。

乔达时间

在Joda-Time中,DateTime对象类似于java.util.Date对象,但实际上知道它自己分配的时区。

Joda-Time提供三个表示时间跨度的类:Period, Duration和Interval。

Interval类使用“半开”方法,其中开头是包含性的,结尾是独占的。 这种方法适用于处理时间跨度和比较。 寻找方便的containsabutsoverlapgap方法。

 int dateInput = 20140214; String start_timeInput = "14:30"; double durationInput = 50.30; // Clean up these inputs. String datePortion = Integer.toString( dateInput ); String input = datePortion + " " + start_timeInput; DateTimeFormatter formatterInput = DateTimeFormat.forPattern( "yyyyMMdd HH:mm"); // Specify the time zone this date-time represents. DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Or, DateTimeZone.UTC DateTime dateTime = formatterInput.withZone( timeZone ).parseDateTime( input ); // Convert fractional hours to milliseconds, then milliseconds to a Duration object. long millis = ( 60L * 60L * (long)(1000L * durationInput) ); // 1 hour = 60 minutes * 60 seconds * 1000 milliseconds. Duration duration = new Duration( millis ); Interval interval = new Interval( dateTime, duration ); DateTimeFormatter formatterOutput = DateTimeFormat.forStyle( "MM" ).withLocale( Locale.FRANCE ); String description = "De " + formatterOutput.print( interval.getStart() ) + " à " + formatterOutput.print( interval.getEnd() ); 

转储到控制台……

 System.out.println( "input: " + input ); System.out.println( "dateTime: " + dateTime ); System.out.println( "duration: " + duration ); // Format: PnYnMnDTnHnMnS (from ISO 8601) System.out.println( "interval: " + interval ); // Format: / (from ISO 8601) System.out.println( "description: " + description ); 

跑的时候……

 input: 20140214 14:30 dateTime: 2014-02-14T14:30:00.000+01:00 duration: PT181080S interval: 2014-02-14T14:30:00.000+01:00/2014-02-16T16:48:00.000+01:00 description: De 14 févr. 2014 14:30:00 à 16 févr. 2014 16:48:00 

你有很多日期陈述。

如果有疑问,我通常会尽快到达unix标准时间(自1970年以来的毫秒)。

在这种情况下,它将整数日期转换为字符串,首先读出四个作为一年,两个数字作为月份,最后两个作为日期,然后在24小时内执行类似的操作,并创建一个java.util.Date就像这样:

 SimpleDateFormat dateParser=new SimpleDateFormat("yyyyMMdd HH:mm"); //please double check the syntax for this guy... String yyyyMmDd = date.toString(); String fullDate = yyyyMmDd + " " + start_time; java.util.Date startDate = dateParser.parse(fullDate); long startTimeInMillis = startDate.getTime(); final long MILLISECONDS_PER_HOUR = 1000*60*60; long durationInMillis = (long)duration*MILLISECONDS_PER_HOUR; java.util.Date endDate = new java.util.Date(startTimeInMillis + durationInMillis); 

不要错过Joda time或Java 8 new,最后改进了名为java.time日期处理。

  you can write like int date = 20140214; String s=""+date; Date date = new SimpleDateFormat("yyyyMMdd").parse(s);