Cobra47
Cobra47

Reputation: 719

How to convert a string to date with UTC/GMT timezone

I have an android app that receives a string in this format:"MM-dd-yyyy HH:mm:ss" from my server. I want to convert this string to a Date object with UTC as timezone since the time in the string is UTC. I've already checked several similar questions but didn't find my answer

Here is what I'm using currently:

SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
            Date date = new Date();
            try {
                date = format.parse(itemContent [3]);
                entity.setValidTill(date);
            }catch (Exception e){

            }

But what it does when I print that date with Log is show it as:

Sun Aug 27 15:00:00 GMT+04:00 2017

I want it to be:

Sun Aug 27 15:00:00 GMT 00:00 2017

So here is the main question how to get DateTime for UTC using a string with format as above?

Edit:

Just put it in a better context. I'm trying to get users to see the difference between current datetime & the that datetime saved in server. So my solution was to get gmt time for users & compare with the server time(which is gmt) so everyone see same difference regardless of their timezone. With C# you can get DateTime.UtcNow while with java I couldn't find an alternative

Upvotes: 0

Views: 7069

Answers (2)

Basil Bourque
Basil Bourque

Reputation: 338730

Briefly, as your Question is really a duplicate of many others…

You are using troublesome old date-time classes that are now legacy, supplanted by the java.time classes.

Parse your input string as a LocalDateTime as it lacks any indicator of offset-from-UTC or time zone.

Define a formatter to parse your input string.

String input = "08-27-2017 15:00:00" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString(): 2017-08-27T15:00

A LocalDateTime is not a moment on the timeline, only a rough idea about a range of possible moments. Has no meaning without the context of an offset (or time zone).

If you are certain that input was intended for UTC, assign the constant ZoneOffset.UTC for a OffsetDateTime.

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

odt.toString(): 2017-08-27T15:00Z

To calculate a delta between that moment and the current moment, use the Period class for coarser granularity in your span of time, or Duration for finer granularity. Both classes generate strings in standard ISO 8601 format of PnYnMnDTnHnMnS.

OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC ) ;
Duration d = Duration.between( odt , now ) ; 

now.toString(): 2017-08-27T21:16:56.396Z

d.toString(): PT6H16M56.396S

See this code run live at IdeOne.com.

In the standard strings seen above, the Z is short for Zulu and means UTC.


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.* classes.

Where to obtain the java.time classes?

Upvotes: 1

Javdroider
Javdroider

Reputation: 136

just add this code under the first line of your code:

format.setTimeZone(TimeZone.getTimeZone("UTC"));

Upvotes: 0

Related Questions