JodaTime - how to get current time in UTC

前端 未结 7 553
天命终不由人
天命终不由人 2020-12-14 01:12

I want to get the current time in UTC. What I do so far is following (just for testing purposes):

    DateTime dt = new DateTime();
    DateTimeZone tz = Dat         


        
相关标签:
7条回答
  • 2020-12-14 01:52
        SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
        // or SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy KK:mm:ss a Z" );
        sdf.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
        System.out.println( sdf.format( new Date() ) 
    
    );
    

    Instead of System.out.println( sdf.format( new Date() ) put your local date

    0 讨论(0)
  • 2020-12-14 01:56

    Please try to listen to Jon Skeets good advise and comments. Here an additional explanation. Your edit-2 contains a mistake:

    DateTimeZone tz = DateTimeZone.getDefault();
    DateTime nowLocal = new DateTime();
    LocalDateTime nowUTC = nowLocal.withZone(DateTimeZone.UTC).toLocalDateTime();
    DateTime nowUTC2 = nowLocal.withZone(DateTimeZone.UTC);
    
    Date dLocal = nowLocal.toDate();
    Date dUTC = nowUTC.toDate();
    Date dUTC2 = nowUTC2.toDate();
    

    If you call toDate() on an object nowUTC of type LocalDateTime then you can get surprises - see javadoc. Joda-Time claims to use the same fields in java.util.Date as in nowUTC. What does this mean? Let's analyze:

    nowUTC.toString() produces 2015-01-02T14:31:38.241 That is without timezone (note the missing Z at the end), so it is just a plain local timestamp. By context, we know it was generated in UTC. In your next step however, you convert it to a java.util.Date using the mentioned method above. This method combines the local timestamp with the system timezone (Belgrade) PRESERVING the FIELDS, hence CHANGING the instant. So you have finally miscorrected your instant. And your second line is wrong.

    If you just want

    utc date displays 14 o'clock

    then don't use the questionable and misleading conversion method Joda-Time offers. Use instead a dedicated formatter with the pattern "EEE MMM dd HH:mm:ss zzz yyyy" or similar (Joda-Time offers DateTimeFormatter). Set the UTC-offset on this formatter and print. Done. Abandon completely any call of java.util.Date.toString(). This way, you don't even need to do any dangerous conversion at all.

    0 讨论(0)
  • 2020-12-14 01:57

    From here: http://www.joda.org/joda-time/userguide.html#Changing_TimeZone

    // get current moment in default time zone
    DateTime dt = new DateTime();
    // translate to London local time
    DateTime dtLondon = dt.withZone(DateTimeZone.forID("Europe/London"));
    

    The resulting value dtLondon has the same absolute millisecond time, but a different set of field values.

    You can substitute `Europe/London' for the timezone you want (UTC). See this list of proper time zone names.

    0 讨论(0)
  • 2020-12-14 01:58

    I fixed this with this converter

    public class DateTimeConverter implements AttributeConverter<DateTime, Date> {
        @Override
        public Date convertToDatabaseColumn(DateTime attribute) {
            return attribute == null ? null
                    : new Date(attribute
                            .withZone(DateTimeZone.UTC)
                            .withZoneRetainFields(DateTimeZone.getDefault())
                            .getMillis());
        }
    
        @Override
        public DateTime convertToEntityAttribute(Date dbData) {
            return dbData == null ? null
                   : new DateTime(dbData.getTime())
                            .withZoneRetainFields(DateTimeZone.UTC)
                            .withZone(DateTimeZone.getDefault());
        }
    }
    

    Dates are stored as UTC and recovered with your current time zone

    0 讨论(0)
  • 2020-12-14 02:01

    You're making it far more complicated than you need to:

    DateTime dt = new DateTime(DateTimeZone.UTC);
    

    No conversion required at all. If you find you actually need to convert, you can use withZone. I'd suggest you avoid going via LocalDateTime, however, as that way you can lose information due to time zone transitions (two different instants can have the same local time in the same time zone, because clocks go back and repeat local time.

    Having said all of this, for the sake of testability I personally like using a Clock interface which allows me to get the current time (e.g. as an Instant). You can then use dependency injection to inject a real system clock when running in production, and a fake clock with a preset time for tests. Java 8's java.time package has this idea built into it, btw.

    0 讨论(0)
  • 2020-12-14 02:01

    Use this

    DateTime.now().withZone(DateTimeZone.UTC)
    

    and if you want to format, you can use

    DateTime.now().withZone(DateTimeZone.UTC).toString("yyyyMMddHHmmss")
    
    0 讨论(0)
提交回复
热议问题