用于日期解析的 SimpleDateFormat 的替代方案

发布于 2025-01-08 08:51:38 字数 585 浏览 0 评论 0原文

我真的需要 SimpleDateFormat 的替代方案,我正在将很多很多 Strig 日期(> 100k)从 JST 转换为 GMT。我遇到的问题是我的代码生成了许多 char[] ,正如我在分析时注意到的那样。对于 150k 日期,我会持续使用 150MB 内存,但这并不是一个真正的选择。谢谢。

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    sdf.setTimeZone(tz);
    try {
        Date theResult = sdf.parse(dateToConvert);
        SimpleDateFormat rdf = new SimpleDateFormat(resultDateFormat);
        rdf.setTimeZone(resultTz);
        return rdf.format(theResult);
    } catch (ParseException e) {
        e.printStackTrace();
    }

我无法使用 Joda 时间,所以这对我来说不是一个选择。 :(

I would really need an alternative to SimpleDateFormat, I am converting many-many Strig dates(>100k) from JST to GMT. The problem I have is that my code generates way to many char[] , as I noticed while profiling. For 150k dates, I get constant 150MB of memory used, and its not really an option. Thanks.

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    sdf.setTimeZone(tz);
    try {
        Date theResult = sdf.parse(dateToConvert);
        SimpleDateFormat rdf = new SimpleDateFormat(resultDateFormat);
        rdf.setTimeZone(resultTz);
        return rdf.format(theResult);
    } catch (ParseException e) {
        e.printStackTrace();
    }

I can not use Joda time, so that is not an option for me. :(

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

凉栀 2025-01-15 08:51:38

使用乔达时间

org.joda.time.format.DateTimeFormatter dtf = 
         org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd");  
    org.joda.time.DateTime date = dtf.parseDateTime(yourDate); // String like 2000-12-12
    date.withZone(yourZone); // org.joda.time.DateTimeZone

use joda-time

org.joda.time.format.DateTimeFormatter dtf = 
         org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd");  
    org.joda.time.DateTime date = dtf.parseDateTime(yourDate); // String like 2000-12-12
    date.withZone(yourZone); // org.joda.time.DateTimeZone
赠佳期 2025-01-15 08:51:38

作为起点,我会重用这些 SimpleDateFormat 实例,而不是为需要转换的每个日期重新创建它们对。

As a starting point, I'd reuse those SimpleDateFormat instances rather than re-creating the pair of them for each date that you need to convert.

來不及說愛妳 2025-01-15 08:51:38

是的,joda time确实有一个很好的API,但是user1143825忘记设置输入时区。
我不能说内存性能,你必须测试它并比较结果。

这应该有效:

DateTimeFormatter sdf = DateTimeFormat.forPattern(dateFormat).withZone(tz);
try {
  DateTime theResult = sdf.parseDateTime(dateToConvert).withZone(resultTz)
  return theResult;
} catch (IllegalArgumentException e) {
  e.printStackTrace();
}

Yes, joda time has realy a nice API, but user1143825 forget to set the input timeZone.
And I cannot say about the memory performance, yout have to test it and compare the results.

This should work:

DateTimeFormatter sdf = DateTimeFormat.forPattern(dateFormat).withZone(tz);
try {
  DateTime theResult = sdf.parseDateTime(dateToConvert).withZone(resultTz)
  return theResult;
} catch (IllegalArgumentException e) {
  e.printStackTrace();
}
若相惜即相离 2025-01-15 08:51:38

使用java

            sample time format //31/Mar/2013:16:59:30 -0700 
            Date date = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z").parse(yourTIME);
            String time= new SimpleDateFormat("dd/MMM/yyyy, HH:mm").format(date);

使用joda库时间转换

         org.joda.time.format.DateTimeFormatter tf=org.joda.time.format.DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z");
         org.joda.time.DateTime date = dtf.parseDateTime(time);
         String time=date.toString("dd/MMM/yyyy, HH:mm"));

这个库提高了我的代码速度性能

使用java代码14991毫秒
使用 joda 库 1668 毫秒

using java

            sample time format //31/Mar/2013:16:59:30 -0700 
            Date date = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z").parse(yourTIME);
            String time= new SimpleDateFormat("dd/MMM/yyyy, HH:mm").format(date);

Using joda Library time conversion

         org.joda.time.format.DateTimeFormatter tf=org.joda.time.format.DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z");
         org.joda.time.DateTime date = dtf.parseDateTime(time);
         String time=date.toString("dd/MMM/yyyy, HH:mm"));

this library is improved my code speed performance

using java code 14991 ms
using joda library 1668 ms

娇纵 2025-01-15 08:51:38

您是否有特定的理由认为 SimpleDateFormat 在解析日期方面效率低下?除非您的日期具有非常具体的特征,可以进行某种优化,否则我认为 JDK 类将完成合理的工作。

也就是说,假设您的日期并不完全不同(不太可能有 100k),您可以研究缓存 - 使用传入的 StringDate 填充地图代码>出来了。这可能会大大减少所需的解析量;它可能会也可能不会导致明显的加速/内存增益,具体取决于现有的特性。

顺便说一句,每次创建两个新的 SimpleDateFormat 可能效率非常低。为什么不在加载类时创建一次这些实例(除非格式按行更改)?如果 SDF 的内部结构在第一次运行时涉及大量 char[] 分配,那么这本身可能会解决您的问题。 (但请记住,奇怪的日期格式不是线程安全的,因此如果同时使用解析类,您可能需要 ThreadLocal)。

Do you have a particular reason to assume that SimpleDateFormat is inefficient at parsing dates? Unless your dates have a very specific characteristic to them that lends itself to a certain optimisation, I would have thought that the JDK class will do a reasonable job of it.

That said, on the assumption that your dates aren't all distinct (unlikely with 100k), you could look into caching - populate a map with the String being passed in and the Date coming out. This will likely greatly reduce the amount of parsing required; it may or may not result in a noticeable speed-up/memory gain depending on the existing characteristics.

As an aside, creating two new SimpleDateFormats each time is likely to be very inefficient. Why not create these instances once when the class is loaded (unless the format changes by the line)? This might solve your problem in itself, if the internals of the SDF are such that it involves a lot of char[] allocation on its first run. (Remember that bizarrely date formats aren't thread-safe, though, so you might want a ThreadLocal<DateFormat> if your parsing class is used concurrently).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文