user1098063
user1098063

Reputation:

problems converting date to long

I am pulling data out of an Excel sheet, to load into Hubspot, using Java. Here is how the data looks:

this date 2018-12-31 becomes Dec 31, 2017 once it's in side Hubspot. This is wrong!

Here is my code:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                df.setTimeZone(TimeZone.getTimeZone("UTC"));
                Date dt = null;
                try {
                    dt = df.parse(member.getUsageEndDate());
                } catch (java.text.ParseException e3) {
                    //dt = null;
                    e3.printStackTrace();
                }                                      
                Long l = dt.getTime(); 

If I open the data in Notepad, it looks like this: 31-May-2018

How can I get this converted properly?

Upvotes: 0

Views: 130

Answers (1)

Basil Bourque
Basil Bourque

Reputation: 339193

tl;dr

OffsetDateTime.of( 
    LocalDate.parse( "2018-12-31" ) , 
    LocalTime.MIN , 
    ZoneOffset.UTC 
)
.toInstant()
.toEpochMilli()

1546214400000

Details

Avoid legacy date-time classes

You are using troublesome old date-time classes long ago made legacy by the arrival of the java.time classes built into Java 8 and later.

ISO 8601

Your input string happens to comply with the ISO 8601 standard formats. These formats are used by default in java.time when parsing/generating strings. So no need to specify a formatting pattern.

LocalDate ld = LocalDate.parse( "2018-12-31" ) ;

First moment of the day

Apparently you need the first moment of the day in UTC for that date. Use OffsetDateTime with constant ZoneOffset.UTC.

OffsetDateTime odt = OffsetDateTime.of( ld , LocalTime.MIN , ZoneOffset.UTC ) ;

Dump to console.

System.out.println( "odt.toString(): " + odt );

See this code run live at IdeOne.com.

odt.toString(): 2018-12-31T00:00Z

Count-from-epoch

You appear to want the count of milliseconds since the epoch reference date of first moment of 1970 in UTC, 1970-01-01T00:00Z. Extract an Instant object, the basic building-block class in java.time, and call its handy Instant::toEpochMilli method.

long millisecondsSinceEpoch = odt.toInstant().toEpochMilli() ;

See this code run live at IdeOne.com.

1546214400000

Going the other direction.

Instant instant = Instant.ofEpochMilli( 1_546_214_400_000L ) ;

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.

Where to obtain the java.time classes?

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

Upvotes: 2

Related Questions