如何获得UTC的年,月,日?

时间:2018-02-03 00:41:53

标签: java android date

我有一些DateCalendar.getInstance()(在我所在的当地时区)获得。

public final class Converter {

    private static final TimeZone UTC_ZONE = TimeZone.getTimeZone("UTC");

    private Converter() {

    }

    public static int toPackedUTCDate(Date date) {
        Calendar c = Calendar.getInstance(UTC_ZONE);
        c.setTime(date);
        int year = c.get(Calendar.YEAR); // UTC year
        int month = c.get(Calendar.MONTH); // UTC month
        int dayOfMonth = c.get(Calendar.DAY_OF_MONTH); // UTC day of month
        return TimeUtils.packDate(dayOfMonth, month, year);
    }
}

当然,这是一个错误的代码,但如何正确? Cuz date是由Calendar.getInstance().getTime()获得的。对不起,我真的无法得到所有这些时区......如果有人能清楚地解释我,我将非常感激。我只需要用户可以输入他的日期(在他当地的时区),我的应用程序已经以自己的打包格式存储为UTC日期。

2 个答案:

答案 0 :(得分:2)

TL;博士

LocalDate.now( ZoneOffset.UTC )

java.time

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是 java.time 类。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

如果要使用JVM的当前默认时区,请求它并作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是明确的。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

如果您想要UTC,请使用定义为ZoneOffset.UTC的常量。

LocalDate todayUtc= LocalDate.now( ZoneOffset.UTC ) ;
  

抱歉,我真的无法获得所有这些时区

这些概念已经在Stack Overflow上进行了很多次讨论,有时非常深入。

发布前彻底搜索。搜索InstantZoneIdZoneOffset,“java.time”,OffsetDateTimeZonedDateTimeDateTimeFormatter

关于 java.time

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

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

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

从哪里获取java.time类?

答案 1 :(得分:1)

import org.scalatest.mockito.MockitoSugar
import org.mockito.Mockito.when    

val config = mock[Config]
val httpConfig = mock[config.Http.type]
when(httpConfig.host).thenReturn("www.example.com")
when(httpConfig.port).thenReturn(80)
when(config.Http).thenReturn(httpConfig)