gpt4 book ai didi

android - 在 Android 中解析日期时的意外副作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:01:04 25 4
gpt4 key购买 nike

在各种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()) 时,两者似乎同时运行并且发生了错误。

最佳答案

SimpleDateFormat 的文档说:

SimpleDateFormat is not thread-safe. Users should create a separate instance for each thread.

给你。只需在每个线程中分别创建 SimpleDateFormat 对象并将其传递给方法即可。

关于android - 在 Android 中解析日期时的意外副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14309607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com