【问题标题】:Create a Java Date from a String and vise versa从字符串创建 Java 日期,反之亦然
【发布时间】:2014-02-22 10:16:46
【问题描述】:

我在Integer format中有一个date(YYYYMMDD)。和start_time 作为String (HH:mm 24 小时制)。和time_duration小时 作为double

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

我想使用这 3 个值并创建 2 个 Java 日期对象。一个是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;
}

有什么简单的方法吗。 ?或者一些我可以使用的内置功能,而不是我用过的?

【问题讨论】:

  • 请向我们展示一个尝试,以便我们为您提供帮助。

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


【解决方案1】:

日期时间的奇怪数据类型

使用:

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

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

避免使用 java.util.Date/Calendar

知道捆绑类 java.util.Date 和 .Calendar 是出了名的麻烦,应该避免。使用Joda-TimeJava 8 中的新java.time.* package (Tutorial)。并熟悉方便的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

【讨论】:

    【解决方案2】:

    你有很多日期的表示。

    如有疑问,我通常会尽快到达 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 新的、最终改进的名为 java.time 的日期处理。

    【讨论】:

      【解决方案3】:
       you can write like
       int date = 20140214;
       String s=""+date;  
       Date date = new SimpleDateFormat("yyyyMMdd").parse(s);
      

      【讨论】:

        猜你喜欢
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 2012-03-06
        • 2014-10-14
        • 1970-01-01
        相关资源
        最近更新 更多