Как получить текущую дату и время вашего часового пояса в Java?

У меня есть приложение, размещенное на лондонском сервере. Я в Мадриде, Испания. Таким образом, часовой пояс составляет -2 часа.

Как я могу получить текущую дату/время в своем часовом поясе.

Date curr_date = new Date(System.currentTimeMillis());

например.

Date curr_date = new Date(System.currentTimeMillis("MAD_TIMEZONE"));

С Joda-Time

DateTimeZone zone = DateTimeZone.forID("Europe/Madrid");
DateTime dt = new DateTime(zone);
int day = dt.getDayOfMonth();
int year = dt.getYear();
int month = dt.getMonthOfYear();
int hours = dt.getHourOfDay();
int minutes = dt.getMinuteOfHour();

Ответ 1

Date всегда зависит от UTC... или нейтральной зоны времени в зависимости от того, как вы хотите ее просматривать. A Date представляет только точку во времени; он не зависит от часового пояса, всего несколько миллисекунд с эпохи Unix. Нет понятия "локальный экземпляр Date". Используйте Date в сочетании с Calendar и/или TimeZone.getDefault(), чтобы использовать "локальный" часовой пояс. Используйте TimeZone.getTimeZone("Europe/Madrid"), чтобы получить часовой пояс в Мадриде.

... или используйте Joda Time, который, как правило, делает все понятным, IMO. В Joda Time вы должны использовать значение DateTime, которое является моментом времени в конкретной системе календаря и часовом поясе.

В Java 8 вы используете java.time.ZonedDateTime, который является эквивалентом Java 8 Joda Time DateTime.

Ответ 2

Как уже сказал Джон Скит, java.util.Date не имеет часового пояса. Объект Date представляет собой несколько миллисекунд с 1 января 1970 года, 12:00, UTC. Он не содержит информацию о часовом поясе.

Когда вы форматируете объект Date в строку, например, используя SimpleDateFormat, вы можете установить часовой пояс на объекте DateFormat, чтобы сообщить ему, в каком часовом поясе вы хотите отображать дату и время

Date date = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Use Madrid time zone to format the date in
df.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));

System.out.println("Date and time in Madrid: " + df.format(date));

Если вы хотите, чтобы локальный часовой пояс компьютера, на котором работает ваша программа, используйте:

df.setTimeZone(TimeZone.getDefault());

Ответ 3

с помощью Calendar прост:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Madrid"));
Date currentDate = calendar.getTime();

Ответ 4

С классами java.time, встроенными в Java 8 и позже:

public static void main(String[] args) {
        LocalDateTime localNow = LocalDateTime.now(TimeZone.getTimeZone("Europe/Madrid").toZoneId());
        System.out.println(localNow);
        // Prints current time of given zone without zone information : 2016-04-28T15:41:17.611
        ZonedDateTime zoneNow = ZonedDateTime.now(TimeZone.getTimeZone("Europe/Madrid").toZoneId());
        System.out.println(zoneNow);
        // Prints current time of given zone with zone information : 2016-04-28T15:41:17.627+02:00[Europe/Madrid]
    }

Ответ 5

Проверьте это может быть полезно. У меня отлично работает. Кодекс также распространяется на летнее время

    TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
    Calendar cal = Calendar.getInstance();      
    // If needed in hours rather than milliseconds
    int LocalOffSethrs = (int) ((cal.getTimeZone().getRawOffset()) *(2.77777778 /10000000));        
    int ChinaOffSethrs = (int) ((tz.getRawOffset()) *(2.77777778 /10000000));       
    int dts = cal.getTimeZone().getDSTSavings();
    System.out.println("Local Time Zone : " + cal.getTimeZone().getDisplayName());
    System.out.println("Local Day Light Time Saving : " + dts);
    System.out.println("China Time : " + tz.getRawOffset());
    System.out.println("Local Offset Time from GMT: " + LocalOffSethrs);
    System.out.println("China Offset Time from GMT: " + ChinaOffSethrs);    
    // Adjust to GMT
    cal.add(Calendar.MILLISECOND,-(cal.getTimeZone().getRawOffset()));  
    // Adjust to Daylight Savings
    cal.add(Calendar.MILLISECOND, - cal.getTimeZone().getDSTSavings());
    // Adjust to Offset
    cal.add(Calendar.MILLISECOND, tz.getRawOffset());       
    Date dt = new Date(cal.getTimeInMillis());              
    System.out.println("After adjusting offset Acctual China Time :" + dt); 

Ответ 6

Для этого вы использовали JodaTime. Java.util.Date очень ограничен относительно TimeZone.

Ответ 7

Я не мог заставить его работать с помощью Calendar. Вы должны использовать DateFormat

//Wednesday, July 20, 2011 3:54:44 PM PDT
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());

//Wednesday, July 20, 2011
df = DateFormat.getDateInstance(DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateString = df.format(new Date());

//3:54:44 PM PDT
df = DateFormat.getTimeInstance(DateFormat.FULL);
df.setTimeZone(Timezone.getTimeZone("PST"));
final String timeString = df.format(new Date());

Ответ 8

Вот пример:

Calendar c = Calendar.getInstance(TimeZone.getDefault());
Date date = c.getTime();

Ответ 9

Вот несколько шагов для поиска времени для вашей зоны:

Date now = new Date();

 DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");  
 df.setTimeZone(TimeZone.getTimeZone("Europe/London"));  

 System.out.println("timeZone.......-->>>>>>"+df.format(now));  

Ответ 10

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());