Простой анализ формата даты Java - возвращает неправильную дату Проблема с часовым поясом? - PullRequest
2 голосов
/ 25 августа 2011

Извините, я думаю, что потратил слишком много времени на это и запутался.

У меня есть следующий код:

    System.out.println("Time Now: " + new Date());    

    Calendar beginningOfDay = new GregorianCalendar();

    beginningOfDay.set(Calendar.HOUR_OF_DAY, 0);
    beginningOfDay.set(Calendar.MINUTE, 0);
    beginningOfDay.set(Calendar.SECOND, 0);
    beginningOfDay.set(Calendar.MILLISECOND, 0);

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");  

    Date specifiedTime = null;
    try{
        specifiedTime = sdf.parse("20:55");     // this time is extracted from interface     
    } catch(ParseException pe){}        // complete this later

    System.out.println("specified time is: " + specifiedTime);

     Calendar runResults = new GregorianCalendar(TimeZone.getDefault());
     if (beginningOfDay.getTimeInMillis() + specifiedTime.getTime() > System.currentTimeMillis())
     {  System.out.println("specified time has not occured yet");
        runResults.setTimeInMillis(beginningOfDay.getTimeInMillis() + specifiedTime.getTime());
        System.out.println("Time to run tests is: " + runResults.getTime()); 
     }
     else
     {  System.out.println("need to run tests tomorrow");
        beginningOfDay.add(Calendar.DATE, 1);       // add a day
        runResults.setTimeInMillis(beginningOfDay.getTimeInMillis() + specifiedTime.getTime());
        System.out.println("Time to run tests is: " + runResults.getTime());  
     }

Что дает следующий вывод:

Time Now: Thu Aug 25 20:17:52 BST 2011
specified time is: Thu Jan 01 20:55:00 GMT 1970
need to run tests tomorrow
Time to run tests is: Fri Aug 26 19:55:00 BST 2011

Так почему указанный анализ времени возвращается с 19:55 BST?

Я пытался установить часовой пояс sdf (simpledateformatter) таким же, как календарь, но, похоже, он не работает.

В идеале я хочу получить любое время (например, «20,55») для преобразования во время в местном часовом поясе, и если это время еще не произошло, тогда таймер отключается в это время. иначе придется подождать до следующего дня. Это код, с помощью которого я пытаюсь вычислить время, когда таймер запускает TimerTask. Если кто-нибудь может предложить лучшее решение, я был бы очень благодарен. Timer должен инициировать TimerTask, когда местное время соответствует указанному в TimeTime.

Еще раз спасибо за любую помощь.

EDIT:

использовал это, чтобы заставить его работать. Не очень аккуратно, хотя

    Calendar timeNow = new GregorianCalendar();

    String timeNowString = timeNow.getTime().toString();
    String timeNowFirstBit = timeNowString.substring(0, 10); // e.g. "Sat Aug 27"
    String timeNowLastBit =  timeNowString.substring(24); // e.g. "2011"

    String userSpecifiedTime = "14:32";    
    SimpleDateFormat specTimeFormat = new SimpleDateFormat("EEE MMM dd HH:mm yyyy");
    String allNewSpecifiedTime = timeNowFirstBit + " " + userSpecifiedTime + " " +                                                                 timeNowLastBit;

    Date specifiedTime = null;
    try{
    specifiedTime = specTimeFormat.parse(allNewSpecifiedTime);
    }   catch (ParseException pe){}

     Calendar runResults = new GregorianCalendar();
     runResults.setTimeInMillis(specifiedTime.getTime());
     if (specifiedTime.getTime() > System.currentTimeMillis())
     {  System.out.println("specified time has not occured yet");          
     }
     else
     {  System.out.println("need to run tests tomorrow");
        runResults.add(Calendar.DATE, 1);       // add a day          
     }
        System.out.println("Time to run tests is: " + runResults.getTime()); 

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Причина в том, что в данный момент времени нет BST .«Британское летнее время начинается в последнее воскресенье марта и заканчивается в последнее воскресенье октября».Так что в январе это время по Гринвичу - перенесите ваше время на лето, и все будет в порядке :).

Хотя это немного сбивает с толку, это хороший вопрос, спасибо.

2 голосов
/ 25 августа 2011

Попробуйте

specifiedTime = new GregorianCalendar();
specifiedTime.set(Calendar.HOUR_OF_DAY, 20 );
specifiedTime.set(Calendar.MINUTE, 55 );
specifiedTime.set(Calendar.SECOND, 0);
specifiedTime.set(Calendar.MILLISECOND, 0);

System.out.println("specified time is: " + specifiedTime.getTime());

или

try{
  specifiedTime = sdf.parse("20:55");     // this time is extracted from interface 
  beginningOfDay.add(Calendar.MILLISECOND, specifiedTime.getTime());
} catch(ParseException pe){}        // complete this later
...