@@ -193,6 +193,37 @@ public Timezone getTimezone(TimezoneParams params) {
193193 return timezone ;
194194 }
195195
196+ /**
197+ * Converts a time from one timezone to another using the IP Geolocation API.
198+ *
199+ * @param params The parameters for timezone conversion, including the source and target timezones,
200+ * as well as the time to convert.
201+ * @return A {@code TimezoneConvert} object representing the converted time.
202+ * @throws IPGeolocationError If an error occurs during the timezone conversion process,
203+ * such as an invalid API response or parameters.
204+ * @see TimezoneConvertParams
205+ * @see TimezoneConvert
206+ */
207+ public TimezoneConvert convertTimeZone (TimezoneConvertParams params ) {
208+ final JSONObject apiResponse =
209+ (JSONObject )
210+ callAPIEndpoint (
211+ "timezone/convert" ,
212+ buildTimezoneConvertUrlParams (params ),
213+ "GET" ,
214+ null ,
215+ false );
216+ final TimezoneConvert timezoneConvert ;
217+
218+ try {
219+ timezoneConvert = new TimezoneConvert (apiResponse );
220+ } catch (IllegalArgumentException e ) {
221+ throw new IPGeolocationError (e );
222+ }
223+
224+ return timezoneConvert ;
225+ }
226+
196227 /**
197228 * Retrieves user-agent information based on the provided user-agent string.
198229 *
@@ -398,6 +429,51 @@ private String buildTimezoneUrlParams(final TimezoneParams params) {
398429 return urlParams .toString ();
399430 }
400431
432+ private String buildTimezoneConvertUrlParams (final TimezoneConvertParams params ) {
433+ final StringBuilder urlParams = new StringBuilder ();
434+
435+ urlParams .append ("apiKey=" );
436+ urlParams .append (apiKey );
437+
438+ if (!Objects .isNull (params )) {
439+ if ((!Strings .isNullOrEmpty (params .getTimezoneFrom ())) && (!Strings .isNullOrEmpty (params .getTimezoneTo ()))) {
440+ urlParams .append ("&tz_from=" );
441+ urlParams .append (params .getTimezoneFrom ());
442+
443+ urlParams .append ("&tz_to=" );
444+ urlParams .append (params .getTimezoneTo ());
445+ }
446+
447+ if ((!Objects .isNull (params .getLatitudeFrom ()) && !Objects .isNull (params .getLongitudeFrom ()))
448+ && ((!Objects .isNull (params .getLatitudeTo ()) && !Objects .isNull (params .getLongitudeTo ())))) {
449+ urlParams .append ("&lat_from=" );
450+ urlParams .append (params .getLatitudeFrom ());
451+ urlParams .append ("&long_from=" );
452+ urlParams .append (params .getLongitudeFrom ());
453+
454+ urlParams .append ("&lat_to=" );
455+ urlParams .append (params .getLatitudeTo ());
456+ urlParams .append ("&long_to=" );
457+ urlParams .append (params .getLongitudeTo ());
458+ }
459+
460+ if ((!Strings .isNullOrEmpty (params .getLocationFrom ())) && (!Strings .isNullOrEmpty (params .getLocationTo ()))) {
461+ urlParams .append ("&location_from=" );
462+ urlParams .append (params .getLocationFrom ());
463+
464+ urlParams .append ("&location_to=" );
465+ urlParams .append (params .getLocationTo ());
466+ }
467+
468+ if (!Strings .isNullOrEmpty (params .getTime ())) {
469+ urlParams .append ("&time=" );
470+ urlParams .append (params .getTime ());
471+ }
472+ }
473+
474+ return urlParams .toString ();
475+ }
476+
401477 private String buildAstronomyUrlParams (final AstronomyParams params ) {
402478 final StringBuilder urlParams = new StringBuilder ();
403479
0 commit comments