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

时间:2014-02-22 10:16:47

标签: java string-conversion java.util.date

我在date (YYYYMMDD)中有一个Integer formatstart_timeString (HH:mm 24小时制)。以time_duration } } } }。{/ p>

double

我想使用这3个值并创建2个Java Date Objects。一个是int date = 20140214; String start_time = "14:30"; double duration = 50.30; ,一个是start_date。它们应采用end_date

格式

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

这是我的尝试。

duration

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

3 个答案:

答案 0 :(得分:1)

日期时间的奇怪数据类型

使用:

  • 用于表示日历日期数字的int
  • 表示时间数字的字符串
  • 表示小时数持续时间的双倍

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

避免使用java.util.Date/Calendar

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

时区

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

使用proper time zone names创建时区对象。避免使用非标准的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: <start>/<end> (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

答案 1 :(得分:0)

你有很多日期陈述。

如果有疑问,我通常会尽快到达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的日期处理。

答案 2 :(得分:0)

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