代码之家  ›  专栏  ›  技术社区  ›  Drawn

Joda Time等价于以下SimpleDateFormat语句

  •  0
  • Drawn  · 技术社区  · 9 年前

    你能帮我吗?

    我读到joda时间比JDK的Date/Calendar/DateFormat类要“轻”得多: Joda Time library performance .

    Joda time显然是由大多数基于数字的类组成的,因此与JDK的同类相比,它的大多数类的创建和存储都“便宜”。

    所以,当我在Joda时间阅读时,你能给我以下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 回复  |  直到 9 年前
        1
  •  0
  •   javaMaster    9 年前

    以下是JODA时间的等效代码:

    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串联,因为这会消耗内存。

        2
  •  0
  •   Meno Hochschild    9 年前

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

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

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

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

    关于您的 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(...) .