将UTC日期转换为当前时区

时间:2016-09-25 19:28:51

标签: java android date

我必须将格式为“2016-09-25 17:26:12”的UTC日期转换为Android的当前时区。我这样做了:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(temp.getString("date"));
System.out.println(mydate.toString());

这有效,但我不知道为什么它也打印“GMT + 02:00”。 这是输出:“Sun Sep 25 19:26:12 GMT + 02:00 2016”,我不想显示“GMT + 02:00”。

编辑,解决方案的代码:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
SimpleDateFormat outputSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date myDate = simpleDateFormat.parse(temp.getString("date"));
System.out.println(outputSdf.format(myDate));

5 个答案:

答案 0 :(得分:1)

它会打印GMT + 02,因为这是您的“本地”时区。 如果您想打印没有时区信息的日期,请使用SimpleDateFormat格式化您喜欢的日期。

编辑:添加代码示例(使用变量'myDate')

SimpleDateFormat inputSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
inputSDF.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = inputSDF.parse("2016-09-25 17:26:12");
//
SimpleDateFormat outputSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(outputSDF.format(myDate));
System.out.println(TimeZone.getDefault().getID());

在(我的)控制台上产生(使用我的本地时区)。

2016-09-25 19:26:12
Europe/Paris

答案 1 :(得分:1)

TL;博士

LocalDateTime.parse( "2016-09-25 17:26:12".replace( " " , "T" ) )
             .atZoneSameInstant( ZoneId.systemDefault() )
             .format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ) )

避免遗留日期时间类

您正在使用与最早版本的Java捆绑在一起的麻烦的旧日期时间类。现在取代了java.time类。

ISO 8601

您输入的字符串几乎符合默认情况下使用java.time类的标准ISO 8601格式。用T替换中间的SPACE。

String input = "2016-09-25 17:26:12".replace( " " , "T" );

LocalDateTime

输入缺少offset-from-UTCtime zone的任何指示。所以我们解析为LocalDateTime

LocalDateTime ldt = LocalDateTime.parse( input );

OffsetDateTime

您声称从应用的上下文中知道此日期时间值是UTC。因此,我们将该偏移量指定为常量ZoneOffset.UTC,以成为OffsetDateTime

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );

ZonedDateTime

您还说要将此值调整为用户JVM(或本例中为Android运行时)的当前默认时区。知道此应用程序执行期间可以随时更改此默认设置。如果时区很重要,则应明确要求用户输入所需/预期的时区。 ZoneId类表示时区。

ZoneId z = ZoneId.systemDefault(); // Or, for example: ZoneId.of( "America/Montreal" )
ZonedDateTime zdt = odt.atZoneSameInstant( z );

生成字符串

你说你想生成一个字符串来表示这个日期时间值。您可以指定所需的任何格式。但通常最好让java.time根据Locale对象中定义的人类语言和文化规范自动进行本地化。使用FormatStyle指定长度或缩写(FULLLONGMEDIUMSHORT)。

Locale locale = Locale.getDefault();  // Or, for example: Locale.CANADA_FRENCH
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( locale );
String output = zdt.format( f );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

您可以使用:

nol <- objects()
nol <- grep("^[a-z]$", nol, value=TRUE)

把你需要的东西

答案 3 :(得分:0)

您可以使用set timezone方法来完成。

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));

答案 4 :(得分:0)

以下是toString()类的Date实现:

public String toString() {
        // "EEE MMM dd HH:mm:ss zzz yyyy";
        BaseCalendar.Date date = normalize();
        StringBuilder sb = new StringBuilder(28);
        int index = date.getDayOfWeek();
        if (index == BaseCalendar.SUNDAY) {
            index = 8;
        }
        convertToAbbr(sb, wtb[index]).append(' ');                        // EEE
        convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
        CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd

        CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');   // HH
        CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
        CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
        TimeZone zi = date.getZone();
        if (zi != null) {
            sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
        } else {
            sb.append("GMT");
        }
        sb.append(' ').append(date.getYear());  // yyyy
        return sb.toString();
    }

如果您看到,它会将时区信息附加到日期。如果您不希望打印它,可以使用SimpleDateFormatDate转换为字符串,例如:

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
System.out.println(format.format(new Date()));