Java - 格式化给定日,月和年整数的日期

时间:2015-01-15 14:44:20

标签: java date

我想使用Java日期格式说明符格式化表示年,月和日的三个数字。我知道我可以创建一个Date对象并使用内置的格式化函数,但我想知道是否有任何方法可以避免创建中间日期对象。考虑到我期待的数据量,我总是要记住垃圾收集开销。

基本上我正在寻找图书馆功能建议或类似建议。

编辑:想法是用户可以指定格式参数。如果他们不重新回到评论中建议的标准格式。所以我会得到像#34; YYYY-DD-MM"并且必须酌情使用它。

3 个答案:

答案 0 :(得分:2)

如果您担心垃圾收集和对象创建,为什么不在您的类或系统中保留一个Calendar实例,并使用静态/同步方法将其用于所有格式化目的?

答案 1 :(得分:0)

在这种情况下,请参阅:

http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#dt

这将允许您使用自定义格式解析日期。我认为这可能是SimpleDateFormatt在引擎盖下使用的内容。 关于你对垃圾收集的担忧,你真的尝试过吗?以下演示代码在我的机器上执行一秒钟(记录和控制台输出省略,因为这会不公平地减慢它):

long startTime = System.currentTimeMillis();
Calendar c = Calendar.getInstance();
DateFormat formatter = SimpleDateFormat.getDateInstance(DateFormat.SHORT);
Random rand = new Random();
for (int i = 0; i < 1000000; ++i)
{
  c.set(Calendar.HOUR_OF_DAY, rand.nextInt(24) + 1);
  c.set(Calendar.DAY_OF_MONTH, rand.nextInt(28) + 1);
  c.set(Calendar.MONTH, rand.nextInt(12) + 1);
  c.set(Calendar.YEAR, rand.nextInt(2015) + 1);
  formatter.format(c.getTime());
}

long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("Time taken: " + TimeUnit.MILLISECONDS.toSeconds(totalTime));

答案 2 :(得分:0)

tl; dr

在要最大程度地减少对象创建的极端数据负载中,请保留DateTimeFormatter个对象以供重复使用。该类本质上是线程安全的,因此您可以在多个线程之间重用。

java.time

几年前,麻烦的日期时间类,例如DateCalendarSimpleDateFormat被定义的现代 java.time 类完全取代了在JSR 310中。

java.time 类的众多优点之一:它们是根据thread-safe设计的,使用immutable objects。这样您就可以保留它们以便重复使用。

LocalDate

对于没有日期和时区的仅日期值,请使用LocalDate类。

LocalDate ld = LocalDate.of( 2019 , 1 , 23 ) ;

要以YYYY-DD-MM的标准ISO 8601格式生成文本,只需调用toString

String output = ld.toString() ;  // ISO 8601 format.

DateTimeFormatter

对于其他格式,请使用DateTimeFormatter类。

同样,您可以放心地保留此类的对象,以便在线程之间重复使用。遍历多个DateTimeFormatter对象,依次尝试每个对象,捕获DateTimeParseException直到成功。

如果由于 extreme 数据负载而担心效率和最大程度地减少对象创建,请聪明地确定哪种格式化程序适合特定输入。例如,字符串的长度可能会告诉您要使用的格式化程序。

此外,请注意,使用DateTimeFormatterBuilder类可以指定可选部分。这有效地使单个格式化程序可以解析多种输入。

让JVM为您服务

最后,一个警告:几乎不必担心担心创建太多对象。

现代的JVM调整得非常好且有效。它们通常对短寿命的物体进行特殊处理,以进行有效处理。不要陷入premature-optimization的陷阱:在编写松散的代码之前,使用性能分析来证明您有可衡量的性能问题。