Конвертировать дату / время для данного часового пояса - Java - PullRequest
59 голосов
/ 06 октября 2011

Я хочу преобразовать эту метку времени GMT в GMT + 13:

2011-10-06 03:35:05

Я попробовал около 100 различных комбинаций DateFormat, TimeZone, Date, GregorianCalendar и т. Д., Чтобы попытаться выполнить эту ОЧЕНЬ базовую задачу.

Этот код делает то, что я хочу для ТЕКУЩЕГО ВРЕМЕНИ:

Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");    
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));  

String newZealandTime = formatter.format(calendar.getTime());

Но я хочу установить время, а не использовать текущее время.

Я обнаружил, что каждый раз, когда я пытаюсь установить время следующим образом:

calendar.setTime(new Date(1317816735000L));

используется TimeZone локальной машины.Это почему?Я знаю, что когда «new Date ()» возвращает время UTC + 0, так почему, когда вы устанавливаете время в миллисекундах, оно больше не предполагает, что время указано в UTC?

Возможно:

  1. Установка времени для объекта (Calendar / Date / TimeStamp)
  2. (возможно) Установка TimeZone начальной отметки времени (calendar.setTimeZone (...))
  3. Отформатируйте отметку времени с помощью нового часового пояса (formatter.setTimeZone (...)))
  4. Возвращает строку с новым часовым поясом.(formatter.format (calendar.getTime ()))

Заранее благодарен за любую помощь: D

Ответы [ 15 ]

0 голосов
/ 21 июня 2019

Чтобы найти длительность или временной интервал с двумя разными часовыми поясами

import org.joda.time.{DateTime, Period, PeriodType}

val s1 = "2019-06-13T05:50:00-07:00"
val s2 = "2019-10-09T11:30:00+09:00"    

val period = new Period(DateTime.parse(s1), DateTime.parse(s2), PeriodType dayTime())

period.getDays
period.getMinutes
period.getHours

период выхода = P117DT13H40M

days = 117
minutes = 40
hours = 13
0 голосов
/ 02 июня 2017
public Timestamp convertLocalTimeToServerDatetime(String dt,String timezone){

    String clientDnT = dt ;// "2017-06-01 07:20:00";
    try{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = sdf.parse(clientDnT);
    TimeZone tz = TimeZone.getTimeZone(timezone.trim()); // get time zone of user
    sdf.setTimeZone(tz);

    // Convert to servertime zone 
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    TimeZone tzInAmerica = TimeZone.getDefault();
    sdf1.setTimeZone(tzInAmerica);

    // assign date to date
    String serverDate = sdf1.format(date);

    // Convert to servertime zone to Timestamp
    Date date2 =  sdf.parse(serverDate);
    Timestamp tsm = new Timestamp(date2.getTime());
    return  tsm;
    }
    catch(Exception e){
        System.err.println(e);
    }

    return null;
}
0 голосов
/ 16 апреля 2016

Ваш подход работает без изменений.

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
// Timestamp for 2011-10-06 03:35:05 GMT
calendar.setTime(new Date(1317872105000L));

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); 
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));

// Prints 2011-10-06 16:35:05 GMT+13:00
System.out.println(formatter.format(calendar.getTime()));
0 голосов
/ 03 июля 2015

Быстрый способ:

String dateText ="Thu, 02 Jul 2015 21:51:46";
long hours = -5; // time difference between places

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(E, dd MMM yyyy HH:mm:ss, Locale.ENGLISH);     
LocalDateTime date = LocalDateTime.parse(dateText, formatter);        
date = date.with(date.plusHours(hours));

System.out.println("NEW DATE: "+date);

Выход

НОВАЯ ДАТА: 2015-07-02T16: 51: 46

0 голосов
/ 05 декабря 2014

Мы можем получить отметку времени UTC / GMT от указанной даты.

/**
 * Get the time stamp in GMT/UTC by passing the valid time (dd-MM-yyyy HH:mm:ss)
 */
public static long getGMTTimeStampFromDate(String datetime) {
    long timeStamp = 0;
    Date localTime = new Date();

    String format = "dd-MM-yyyy HH:mm:ss";
    SimpleDateFormat sdfLocalFormat = new SimpleDateFormat(format);
    sdfLocalFormat.setTimeZone(TimeZone.getDefault());

    try {

        localTime = (Date) sdfLocalFormat.parse(datetime); 

        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"),
                Locale.getDefault());
        TimeZone tz = cal.getTimeZone();

        cal.setTime(localTime);

        timeStamp = (localTime.getTime()/1000);
        Log.d("GMT TimeStamp: ", " Date TimegmtTime: " + datetime
                + ", GMT TimeStamp : " + localTime.getTime());

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return timeStamp;

}

Будет возвращено время UTC на основе пройденной даты.

  • Мы можем сделать обратное, как отметку времени UTC, к текущей дате и времени (наоборот)

        public static String getLocalTimeFromGMT(long gmtTimeStamp) {
                 try{
                        Calendar calendar = Calendar.getInstance();
                        TimeZone tz = TimeZone.getDefault();
                        calendar.setTimeInMillis(gmtTimeStamp * 1000);
        //              calendar.add(Calendar.MILLISECOND, tz.getOffset(calendar.getTimeInMillis())); 
                        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
                        Date currenTimeZone = (Date) calendar.getTime();
                        return sdf.format(currenTimeZone);
                    }catch (Exception e) {
                    }
                    return "";  
                }
    

Надеюсь, это поможет другим. Спасибо !!

...