import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
	public static void main(String[] args) {
		Instant instant = Instant.now();
		System.out.println(instant);

		ZonedDateTime zdtUtc = instant.atZone(ZoneId.of("Etc/UTC"));
		System.out.println(zdtUtc);
		ZonedDateTime zdtNewYork = instant.atZone(ZoneId.of("America/New_York"));
		System.out.println(zdtNewYork);

		// Fixed offset
		OffsetDateTime odtUtc = instant.atOffset(ZoneOffset.UTC);
		System.out.println(odtUtc);
		OffsetDateTime odtWithOffset0530Hours = instant.atOffset(ZoneOffset.of("+05:30"));
		System.out.println(odtWithOffset0530Hours);

		// OffsetDateTime from ZonedDateTime
		OffsetDateTime odtNewYork = zdtNewYork.toOffsetDateTime();
		System.out.println(odtNewYork);

		// LocalDate in New York
		LocalDate todayNewYork = zdtNewYork.toLocalDate();
		System.out.println(todayNewYork);
		// Alternatively
		System.out.println(LocalDate.now(ZoneId.of("America/New_York")));

		// LocalDateTime in New York
		LocalDateTime nowNewYork = zdtNewYork.toLocalDateTime();
		System.out.println(nowNewYork);
		// Alternatively
		System.out.println(LocalDateTime.now(ZoneId.of("America/New_York")));

		// Formatted output
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMMM dd HH:mm:ss z uuuu", Locale.ENGLISH);
		System.out.println(dtf.format(zdtNewYork));
	}
}