2012-11-16 43 views
0

我的控制器收到这个字符串“20120115Z”作为@RequestParam,代表一个日期。拆分没有分隔符的字符串

我想将它转换为这种格式:yyyy-MM-dd,所以我会有一个像这样的新字符串2012-01-15。如你所见,没有分隔符,只有'Z'始终作为最后一个字符。

我的做法是相当明显的:

String data = 
strData.substring(0, 4) + "-" + 
strData.substring(4, 6) + "-" + 
strData.substring(6, 8); 

和它的作品,但你知道这些“幻数”的东西,以避免。我还尝试使用“^ [^ \ s] {4} [^ \ s] {2} [^ \ s] {2} Z $”等正则表达式,但没有成功。

有什么想法?

更新:最后,我已经与乔达时间DateTime类做了它作为@布赖恩·阿格纽建议

DateTimeFormatter fmt = DateTimeFormat.forPattern("YYYYMMdd'T'hhmm'Z'"); 
String strData = "20120115T0600Z"; 
DateTime dt = fmt.parseDateTime(strData); 

打印方法:

private static void printDateTime(DateTime dt) { 
    int year = dt.getYear(); 
    int month = dt.getMonthOfYear(); 
    int day = dt.getDayOfMonth(); 
    int hour = dt.getHourOfDay(); 
    int minute = dt.getMinuteOfHour(); 
    int second = dt.getSecondOfMinute(); 
    int millis = dt.getMillisOfSecond(); 
    String zone = dt.getZone().toString(); 
    log.info("fecha: " 
      + day + "/" + month + "/" + year + " " + hour + ":" + minute + ":" + second + ":" + millis 
      + " " + zone + "\n"); 
} 

输出

15/1/2012 6:0:0:0 UTC 

谢谢大家

+3

如果选择是在魔术数字和正则表达式的诅咒中使用的相同数字之间,那么... –

+2

为什么你想要避免这些数字?我的意思是,如果你也使用正则表达式,你需要使用长度。所以,没有出路。并且。它更好地去与子字符串。 –

+1

你的方法很好。保持简单,只需使用子字符串。如果你真的关心幻数,然后将它们拉出到常量,例如YEAR_LENGTH等。但如果是我,我只是把它放在一个有名的方法和评论,所以很明显。 – EdC

回答

4

我也许会用Joda-Time DateTimeFormat

为什么?它会检查格式,包括小时/分钟/秒的有效值,然后给您一个合适的对象,您可以使用该对象(包括使用类似方法对其进行重新格式化)。

你只要给它一个你想要解析的格式,它会完成所有的工作。你有一个约会,所以对待它。

+0

感谢Brian,可能你的解决方案是最好的选择。 Joda-Time看起来不错,同时也给出了来自java Date和Calendar类的典型问题的解决方案。 但是现在我不想只为这个任务使用额外的库,所以substring()会赢得..也许在下一个项目中。谢谢! – Emilio

+0

我真的不建议限制使用其他库。乔达对于正确的直觉日期工作来说非常重要。 Apache Commons有很多有用的东西等等。这些将为您节省大量的工作。 –

+0

你是对的Brian, 我只是在等待一段时间来了解它是如何工作的,它肯定会出现在我的项目中。 – Emilio