我在尝试解析日期字符串时遇到了这个奇怪的问题,我已将其解释为:
具有一些英语区域设置的设备(模拟器):
Date.toString()
给出“2月18日星期四,格林威治标准时间2016年13:25:22”
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 GMT 2016"); //works fine
具有德语区域设置的设备:
Date.toString()
给出“星期二2月18日13:25:22 MEZ 2016”(注意德语时区,周四仍然是周四)
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 MEZ 2016"); //does not parse
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.GERMAN);
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 MEZ 2016"); //does not parse
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
String s = "Thu Feb 18 13:25:22 MEZ 2016";
s.replace("MEZ", "CET");
d1 = newDateFormat.parse(s); //works fine, but doesn't seem very portable
所以我正在寻找一种让SimpleDateFormat完全忽略时区的方法(这对我的应用程序来说很好,我在这里尝试做的唯一一件事就是给“最后一次”时间差,如果不到一天,将在几小时内给出,但如果更多则在几天或几周内给出,因此对于这个用例,时区对此不会那么重要),
或者让SimpleDateFormat
了解设备语言中的时区的方法。
奖励积分是一种以与语言无关的方式保存日期的好方法,同时仍保留该时区内的时区和时段等信息。 (下次我升级数据库的时候)
答案 0 :(得分:0)
我这样做是为了以YYYY-MM-DD
格式获取当前日期。
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String CurrentDate = formatter.format(new Date());
Date current_date = formatter.parse(CurrentDate); //In case need the entire Date value
希望这有帮助!
答案 1 :(得分:0)
获得你想要的结果(我相信看起来像是:Mi.März15:15:58 02-03-16 MEZ )
我习惯了以下代码:
public static final String DATE_FORMAT = "EEE MMM HH:mm:ss dd-MM-yy z";
private DateTimeFormatter mDateFormatter = DateTimeFormat.forPattern(DATE_FORMAT).withLocale(Locale.GERMAN);
/**
* Get formatted Date as Human Readable String
* @param dateTime the time to print
* @return Date as String
*/
public String getFormattedDate(@NonNull DateTime dateTime) {
return mDateFormatter.print(dateTime);
}
如果您想要时差,可能需要查看JodaTime
(http://www.joda.org/joda-time/)。我自己使用它,它为时差提供了简单的界面(Days
,Hours
,Minutes
,Months
,Seconds
,Weeks
,Years
)。
将您的日期保存在Unix时间(ISO 8601),这是您需要的所有信息。
答案 2 :(得分:0)
当您实例化SimpleDateFormat时,
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
SimpleDateFormat
有一个构造函数,它接受一个语言环境,SimpleDateFormat(String)
构造函数现在已被弃用,你应该使用接受语言环境的构造函数,
DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.getDefault());
现在,如果您使用此df.parse(myDateString)
,则不需要从MEZ
到CET
进行字符串替换,因为SimpleDateFormat知道您的语言环境会正确解析日期