Joda-Time 等效于以下 SimpleDateFormat 语句

Joda-Time equivalent of the following SimpleDateFormat statements

你能帮我吗?

我读到 joda-time 比 JDK 的 Date/Calendar/DateFormat 类 多 'lighter':Joda Time library performance

Joda-time 显然是由大多数基于长数字的 类 组成的,因此与 JDK 相比,它的大部分 类 都是 'cheaper' 创建和存储的的等价物。

所以当我继续阅读 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);

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

关于性能和内部存储格式:

如果你仔细阅读和研究性能文章系列,你会发现基于 long 的 classes 的构造和存储很便宜。最便宜的确实是java.util.Date.

但是等等:CPU-资源的主要消耗发生在别处,即通过将如此长的数字转换为字段元组(使用公历规则等)或内部锁定(例如通过访问同步可变时区状态)。

事实上,Joda-LocalDate 使用长元组而不是整数元组来表示年、月和月中的日期,这一事实并不理想,因为格式化非常需要元组而不是长元组。新的 java.time.LocalDate class 有元组格式——一个改进。所以我不会对Joda-Time的表现太过热情。只比java.util.GregorianCalendar.

关于您的 SimpleDateFormat-常量

令人震惊的是,您对 class(如 SimpleDateFormat)使用了非线程安全的常量。但好消息是 Joda-Time 有自己的格式引擎,可以生成不可变的、线程安全的格式化程序。所以你打算的迁移与你实际拥有的相比是一个明显的改进。

Joda-Time 的格式化程序 class 称为 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);

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

而不是 format(...)

以下是 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");

您提到了性能问题,因此请避免使用过多的字符串声明和字符串连接,因为它会消耗内存。