在Android的解析日期时意外的副作用(Unexpected side effects when

2019-08-06 17:37发布

在各种Android的项目中,我用下面的静态函数解析的日期,如1900-12-31 。 当然,这个功能应该是确定的 - 但事实证明并非如此。 为什么?

通常情况下,它解析日期2010-10-30 ,例如,以正确的Date实例保存该值。 但我注意到,当我有一个IntentService在同一时间运行和分析一些日期,此函数解析同一天以上1983-01-20 ,这是在解析日期的一个IntentService 。 这是怎样发生的?

public static Date dateFromString(String dateStr) {
    SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    SimpleDateFormat mDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.getDefault());
    Date dateOut = null;
    try {
        if (dateStr != null) {
            if (dateStr.length() == 7) {
                if (dateStr.startsWith("--")) {
                    dateStr = "0000"+dateStr.substring(1);
                }
            }
            else if (dateStr.length() == 6) {
                if (dateStr.startsWith("-")) {
                    dateStr = "0000"+dateStr;
                }
            }
            else if (dateStr.length() == 5) {
                dateStr = "0000-"+dateStr;
            }
            else if (dateStr.matches("[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}")) {
                dateStr = dateStr.substring(6, 10)+"-"+dateStr.substring(3, 5)+"-"+dateStr.substring(0, 2);
            }
            else if (dateStr.matches("[0-9]{2}\\/[0-9]{2}\\/[0-9]{4}")) {
                dateStr = dateStr.substring(6, 10)+"-"+dateStr.substring(3, 5)+"-"+dateStr.substring(0, 2);
            }
            else if (dateStr.matches("[0-9]{8}")) {
                dateStr = dateStr.substring(0, 4)+"-"+dateStr.substring(4, 6)+"-"+dateStr.substring(6, 8);
            }
            if (dateStr.length() >= 20) {
                String dateTimeStr = dateStr.trim();
                if (dateTimeStr.endsWith("Z")) {
                    dateTimeStr = dateStr.substring(0, dateTimeStr.length()-1)+"+0000";
                }
                if (dateStr.charAt(10) == ' ') {
                    dateTimeStr = dateStr.substring(0, 10)+"T"+dateStr.substring(11);
                }
                try {
                    dateOut = mDateTimeFormat.parse(dateTimeStr);
                }
                catch (Exception e2) {
                    dateOut = mDateFormat.parse(dateStr);
                }
            }
            else {
                dateOut = mDateFormat.parse(dateStr);
            }
        }
    }
    catch (Exception e) {
        dateOut = null;
    }
    return dateOut;
}

编辑:我做我的分析ActivityonCreate()我开始一个AsyncTask ,没有工作。 在ActivityonStop()后台服务启动该做相同的工作。 当我关闭应用程序(的onStop()),并迅速重新启动它(的onCreate()),似乎都可以同时运行和错误occurrs。

Answer 1:

的文档SimpleDateFormat说:

SimpleDateFormat的是不是线程安全的。 用户应为每个线程创建一个单独的实例。

你去那里。 刚创建SimpleDateFormat中的每个单独的线程对象,并把它传递给方法。



文章来源: Unexpected side effects when parsing dates in Android