【问题标题】:Joda-Time equivalent of the following SimpleDateFormat statementsJoda-Time 等效于以下 SimpleDateFormat 语句
【发布时间】:2015-05-15 01:34:59
【问题描述】:

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

我听说 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”。在这里寻找性能,你看。

【问题讨论】:

    标签: jodatime simpledateformat


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的宝贵时间。
    【解决方案2】:

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

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

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

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

    关于您的SimpleDateFormat-constants

    令人震惊的是,您已经为像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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2015-01-20
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多