你能帮我解决这个问题吗?
我已经读过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"。在这里寻找表现,你看。
答案 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连接,因为它会消耗内存。