Как узнать текущую дату и время вашего часового пояса в Java? - PullRequest
47 голосов
/ 20 августа 2009

Мое приложение размещено на лондонском сервере. Я в Мадриде, Испания. Так что часовой пояс -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();

Ответы [ 10 ]

84 голосов
/ 20 августа 2009

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

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

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

в Joda Time.
49 голосов
/ 20 августа 2009

Как уже сказал Джон Скит, 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's 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());
16 голосов
/ 20 августа 2009

с использованием Календарь прост:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Madrid"));
Date currentDate = calendar.getTime();
9 голосов
/ 28 апреля 2016

С классами 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]
    }
3 голосов
/ 20 марта 2012

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

    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); 
2 голосов
/ 20 августа 2009

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

1 голос
/ 21 июля 2011

Я не смог заставить его работать с помощью Календаря. Вы должны использовать 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());
0 голосов
/ 16 июля 2014

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

Дата сейчас = новая Дата ();

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

 System.out.println("timeZone.......-->>>>>>"+df.format(now));  
0 голосов
/ 28 ноября 2011
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());
0 голосов
/ 20 августа 2009

Вот пример:

Calendar c = Calendar.getInstance(TimeZone.getDefault());
Date date = c.getTime();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...