具有不同语言的时区名称的SimpleDateFormat

时间:2016-03-02 09:26:04

标签: android date locale timestamp-with-timezone

我在尝试解析日期字符串时遇到了这个奇怪的问题,我已将其解释为:

具有一些英语区域设置的设备(模拟器):

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了解设备语言中的时区的方法。

奖励积分是一种以与语言无关的方式保存日期的好方法,同时仍保留该时区内的时区和时段等信息。 (下次我升级数据库的时候)

3 个答案:

答案 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);
}

如果您想要时差,可能需要查看JodaTimehttp://www.joda.org/joda-time/)。我自己使用它,它为时差提供了简单的界面(DaysHoursMinutesMonthsSecondsWeeksYears)。

将您的日期保存在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),则不需要从MEZCET进行字符串替换,因为SimpleDateFormat知道您的语言环境会正确解析日期