Skip to content
Advertisement

Convert time from specific timezone to UTC (ColdFusion/Java)

We need to take a datetime string (which we’ve already received and validated from user form inputs), treat it as being specific to the America/New_York timezone, and convert it to UTC.

We’re currently running ColdFusion 2018, which is limited in its native datetime functionality. So I wanted to tap into the underlying Java. Most CF-related solutions are pre-java.time, so I attempted my own based on other Stack Overflow answers. Hoping someone with more Java knowledge can review this solution. (This is in CF Script, but it should be pretty self-documenting.) Is this correct and is there a better/more efficient solution?

var validatedDateTime = '2022-06-29T14:30:00';

LocalDateTime = createObject('java', 'java.time.LocalDateTime');
ZoneID = createObject('java', 'java.time.ZoneId');
ZoneOffset = createObject('java', 'java.time.ZoneOffset');

ldt = LocalDateTime.parse(validatedDateTime);
nyZone = ZoneID.of('America/New_York');
odt = ldt.atOffset(nyZone.getRules().getOffset(ldt));
utcDateTime = odt.withOffsetSameInstant(ZoneOffset.UTC).toLocalDateTime();```

Advertisement

Answer

tl;dr

You said:

The question is more about taking a datetime string (e.g. ‘2022-06-29T14:30:00’), adding the America/New_York timezone to it, and converting it to UTC.

LocalDateTime
.parse( "2022-06-29T14:30:00" )      // “taking a datetime string (e.g. '2022-06-29T14:30:00')”
.atZone( 
    ZoneId.of( "America/New_York" )  // “adding the America/New_York timezone to it”
)                                    // Returns a `ZonedDateTime` object. 
.toInstant()                         // “converting it to UTC”

See this code run live at Ideone.com.

2022-06-29T18:30:00Z

Details

You neglected to mention your database engine and the precise type of your column. So we cannot give a full answer. I can address part of it.

So the goal is to take the user’s date & time, treat it like America/New_York, and convert it to UTC.

DateTimeFormatter fDate = DateTimeFormatter. … ;  // Define a formatter to match the format used by your user. 
LocalDate ld = LocalDate.parse( inputDate , fDate ) ;

Trap for DateTimeParseException to detect faulty inputs.

Do similarly for LocalTime.

DateTimeFormatter fTime = DateTimeFormatter. … ;  // Define a formatter to match the format used by your user. 
LocalTime lt = LocalDate.parse( inputTime , fTime ) ;

Combine with time zone to determine a moment.

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt =
ZonedDateTime.of( ld , lt , z ) ;

Adjust to UTC.

Instant instant = zdt.toInstant() ;

All of this has been covered many many times on Stack Overflow. Search to learn more.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement