【问题标题】:SimpleDateFormat parsing date differently on some android devicesSimpleDateFormat 在某些 android 设备上以不同方式解析日期
【发布时间】:2015-05-26 18:25:23
【问题描述】:

我将日期解析为:

public class Consts{
public static final SimpleDateFormat DATE_FORMATTER_WITHOUT_TIME_ZONE = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm");
public static final SimpleDateFormat DATE_FORMATTER_2 = new SimpleDateFormat(
            "MM-dd-yyyy HH:mm:ss ZZZZ");
}

        cDate = new GregorianCalendar();
        sDate = new GregorianCalendar();
        eDate = new GregorianCalendar();

        if (mStartTimeTV.getText().toString().equals("Now")) {
            sDate.setTime(cDate.getTime());
        } else {
            sDate.setTime(Consts.DATE_FORMATTER_WITHOUT_TIME_ZONE
                    .parse(mStartTimeTV.getText().toString()));
        }

        if (!mEndTimeTV.getText().toString().equals("")) {
            eDate.setTime(Consts.DATE_FORMATTER_WITHOUT_TIME_ZONE
                    .parse(mEndTimeTV.getText().toString()));
        } else {
            eDate.setTime(sDate.getTime());
            // eDate = sDate;
        }

然后我在发送到服务器之前将日期格式化如下:

request.addProperty("StartTime",
                        Consts.DATE_FORMATTER_2.format(sDate.getTime()));
                request.addProperty("EndTime",
                        Consts.DATE_FORMATTER_2.format(eDate.getTime()));

但问题是在运行 4.1.2 的设备上,它发送的日期为:

Start Date: 03-23-2015 21:17:20 +0500 End Date : 10-23-2015 21:15:00 +0500

在服务器端引发异常。

但在其他设备上,它发送日期为:

Start Date: 03-23-2015 21:12:13 GMT+05:00 End Date : 03-23-2015 21:16:00 GMT+05:00

这是必需的。

我做错了吗?我怎样才能防止这个问题,以便所有设备发送相同的日期。 (例如03-23-2015 21:16:00 GMT+05:00

【问题讨论】:

  • 我没有看到an issue for this。你能确认你在模拟器上得到了同样的行为吗?还是来自某些制造商的设备?
  • 我已经在运行 4.1.1 的 Geny 运动模拟器上进行了尝试,它运行良好。运行 4.1.2 的三星和 HTC 存在问题。
  • 试用官方 Android SDK 模拟器。 Genymotion 应该镜像它,因为它也是基于 AOSP,所以官方模拟器将是一个更好的兼容性测试。如果这只发生在这些设备上,您可能需要查看服务器是否可以支持不同的时区编码,或者可能切换到 SimpleDateFormat 以外的其他内容(例如 Joda Time)。
  • 您应该始终使用 joda-time 而不是 JDK 日历/日期混乱
  • 你们能告诉我如何将日期格式化为:03-23-2015 21:16:00 GMT+05:00,我尝试过DateTimeFormatter DATE_FORMATTER_2 = DateTimeFormat .forPattern("MM-dd-yyyy HH:mm:ss z");DateTimeFormatter DATE_FORMATTER_2 = DateTimeFormat .forPattern("MM-dd-yyyy HH:mm:ss zzzz"),但没有运气。

标签: java android date datetime simpledateformat


【解决方案1】:

差异是由设备上设置的区域设置不同造成的。

为了减轻语言环境的差异,您应该在格式化日期字符串时使用特定的语言环境。这是我的代码示例,解决了同样的问题:

new SimpleDateFormat(C.FORMAT_DATETIMEZ, Locale.US).format(new Date(time))

【讨论】:

  • 实际上是我们想将日期发送到带有区域设置的服务器,然后服务器将在将它们转换为 UTC/GMT 之后存储日期以及我们何时从服务器获取带有日期的数据我们将再次根据设备区域设置对其进行格式化。
  • 单独发送Locale
【解决方案2】:

您可以扩展 SimpleDateFormat 并覆盖它的 format(...) 函数,如下所示:

public class ExSimpleDateFormat extends SimpleDateFormat{

    private static final long serialVersionUID = -8275126788734707527L;

    public ExSimpleDateFormat() {

        super();
    }

    public ExSimpleDateFormat(String string, Locale us) {

        super(string, us);
    }

    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, java.text.FieldPosition pos)
    {            
        final StringBuffer buf = super.format(date, toAppendTo, pos);
        buf.insert(buf.length() - 2, ':');
        return buf;
    };
}

并执行以下代码:

Calendar ca = Calendar.getInstance();       
ca.setTimeInMillis(System.currentTimeMillis());
ExSimpleDateFormat exSimpleDateFormat = new ExSimpleDateFormat("dd-MM-yyyy HH:mm:ss 'GMT'Z", Locale.US);
exSimpleDateFormat.setTimeZone(ca.getTimeZone()); //your device timezone which can be GMT+xx:yy or GMT-xx:yy
String desiredTime = exSimpleDateFormat.format(ca.getTime());

输出如下:23-03-2015 23:12:52 GMT+05:00

如果有帮助,请告诉我。 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多