Joda-Time等效于以下SimpleDateFormat语句

时间:2015-03-12 18:25:48

标签: jodatime simpledateformat

你能帮我解决这个问题吗?

我已经读过joda-time更轻,更轻松了。比JDK的Date / Calendar / DateFormat类:Joda Time library performance

Joda-time显然是由长期数量很多的课程组成的,所以它的大多数课程都比较便宜。与JDK相当的创建和存储。

所以当我读到Joda-time时,你会给我相当于以下的SimpleDateFormat语句吗?:

    private static final String Y_M_D = "yyyy-MM-dd ";
    private static final String W_M_D = "EEE, MMM d ";
    private static final String W_Y_M_D = "EEE, yyyy-MM-dd ";
    private static final String HOURS_12 = " h:mm a";
    private static final String HOURS_24 = " HH:mm";

    private static final DateFormat mDateFormat = new SimpleDateFormat(Y_M_D);

    private static final DateFormat mDayFormat = new SimpleDateFormat(W_M_D);

    private static final DateFormat mW_Y_M_D12HrFormat = new SimpleDateFormat(W_Y_M_D + HOURS_12);

    private static final DateFormat m12DateTimeFormat = new SimpleDateFormat(W_M_D + HOURS_12);

//    private static final DateFormat m24DateTimeFormat = new SimpleDateFormat(W_M_D + HOURS_24);

    private static final DateFormat m12TimeFormat = new SimpleDateFormat(HOURS_12);

//    private static final DateFormat m24TimeFormat = new SimpleDateFormat(HOURS_24);

    // This is the format to store in the database not necessarily to display.
    private static final DateFormat mStoredFormat = new SimpleDateFormat(Y_M_D + HOURS_12);

    // Used to convert strings to Epoch
    private static final DateFormat mEpochFormat = new SimpleDateFormat(Y_M_D + HOURS_24);

更好的是,也许你们中的一些人写了最终的日期时间'解析器'从一个提供的原始字符串转换为许多格式模式(如上面列出的那些),例如:" yyyy-MM-dd HH:mm"。在这里寻找表现,你看。

2 个答案:

答案 0 :(得分:0)

关于效果和内部存储格式:

如果您仔细阅读并研究性能文章系列,那么您会发现长基类的构造和存储很便宜。最便宜的类型确实是java.util.Date

但是等待:CPU资源的主要消耗发生在其他地方,即通过将这样的长数字转换为字段元组(使用格里历日历规则等)或内部锁定(例如通过访问同步的可变时区状态)。 / p>

Joda - LocalDate使用长而不是整数元组来表示年,月和日的事实并不理想,因为格式化需要元组而不是长元组。新的java.time.LocalDate类具有元组格式 - 一种改进。所以我不会对Joda-Time的表现过于热情。与java.util.GregorianCalendar相比,它只会更好。

关于SimpleDateFormat - 常量

相当惊人的是,您已经为SimpleDateFormat这样的类使用了常量,这类不是线程安全的。但好消息是Joda-Time有自己的格式引擎,可以生成不可变的,因此是线程安全的格式化程序。因此,与您实际拥有的迁移相比,您想要的迁移是明显的改进。

Joda-Time的格式化程序类称为DateTimeFormatter。它还接受模式字符串。虽然模式方言不一样,但至少可以转移问题1:1中提到的模式。例如:

   // old:  private static final DateFormat mDayFormat = new SimpleDateFormat(W_M_D);

   // new:  private static final DateTimeFormatter mDayFormat =
              DateTimeFormat.forPattern(W_M_D);

当然,在大多数情况下,您必须调整其他更改,主要是更改格式化程序上的方法调用,例如调用format(...)而不是print(...)

答案 1 :(得分:0)

以下是JODA-time中的等效代码:

private static final DateTimeFormatter mDateFormat = DateTimeFormat.forPattern("yyyy-MM-dd");
private static final DateTimeFormatter mDayFormat = DateTimeFormat.forPattern("EEE, MMM d");
private static final DateTimeFormatter mW_Y_M_D12HrFormat = DateTimeFormat.forPattern("EEE, yyyy-MM-dd h:mm a");
private static final DateTimeFormatter m12DateTimeFormat = DateTimeFormat.forPattern("EEE, MMM d h:mm a");
private static final DateTimeFormatter m12TimeFormat = DateTimeFormat.forPattern("h:mm a");

private static final DateTimeFormatter mStoredFormat = DateTimeFormat.forPattern("yyyy-MM-dd h:mm a");
private static final DateTimeFormatter mEpochFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");

你提到了性能,所以避免使用太多的String声明和String连接,因为它会消耗内存。