Могу ли я увидеть часовой пояс, измененный в реальном времени в java? [Дубликат]

Мне нужно было сделать что-то подобное для перечислений. Я имею переменную и хочу ее протестировать против диапазонов значений.

Здесь я использовал вариационную функцию шаблона. Обратите внимание на специализацию для типа const char*, так что is_in( my_str, "a", "b", "c") имеет ожидаемый результат, когда my_str сохраняет "a".

#include <cstring> 

template<typename T>
constexpr  bool is_in(T t, T v) {
  return t == v;
}

template<>
constexpr  bool is_in(const char* t, const char* v) {
  return std::strcmp(t,v);
}

template<typename T, typename... Args>
constexpr bool is_in(T t, T v, Args... args) {
  return  t==v || is_in(t,args...);
}

Пример использования:

enum class day
{
  mon, tues, wed, thur, fri, sat, sun
};

bool is_weekend(day d)
{
  return is_in(d, day::sat, day::sun);
}
2
задан HeisenBerg 11 February 2016 в 08:05
поделиться

3 ответа

Ответ на neuhaus верен.

Если вы имели в виду, что вы изменили часовой пояс вашей операционной системы хоста во время выполнения этого кода, знайте, что виртуальная машина Java (JVM ) имеет свой текущий текущий часовой пояс по умолчанию.

Обычно это значение по умолчанию выбирается из того, что принадлежит ОС хоста. Если это так, то это означает, что ваша реализация Java обнаруживает часовой пояс хоста только при запуске и не проверяет последующие изменения часового пояса хоста.

Часовой пояс вашего JVM также можно установить в качестве параметра конфигурации при запуске. В этом случае я должен подумать, что JVM намеренно игнорирует изменения часовых поясов ОС хоста.

Любой Java-код в любом потоке любого приложения в этой JVM может изменить текущий часовой пояс JVM в любой момент во время выполнения. Опять же, я должен подумать, что JVM намеренно игнорирует изменения часовых поясов ОС хоста.

Класс doc для java.util.TimeZone.getDefault() описывает шаги, связанные с определением текущего часового пояса по умолчанию.

Если кешированный по умолчанию TimeZone доступен, его клон возвращается. В противном случае метод принимает следующие шаги для определения часовой пояс по умолчанию.

• Используйте значение свойства user.timezone в качестве идентификатора часового пояса по умолчанию, если оно доступно.

• Обнаружить идентификатор зоны платформы. Источник отображения часового пояса платформы и идентификатора может отличаться в зависимости от реализации.

• Используйте GMT ​​в качестве последнего средства, если данный или обнаруженный идентификатор часового пояса неизвестен.

По умолчанию TimeZone созданный из идентификатора, кэшируется, и возвращается его клон. Значение свойства user.timezone установлено на идентификатор по возврату.

В моем чтении это говорит, что JVM не собирается обнаруживать какие-либо изменения в настройке хост-OS. После запуска и после определения по умолчанию он сохраняется в этом свойстве user.timezone (и в кеше) до тех пор, пока не будет изменен с вызовом на setDefault .

java.time

Вы используете старый класс java.util.Date, который был вытеснен java.time framework в Java 8.

Используйте класс java.time.ZonedDateTime и укажите желаемый / ожидаемый часовой пояс.

ZoneId zoneId = ZoneId.of( " America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now( ZoneId );

Вы почти никогда не должны зависеть от текущего часового пояса JVM (или текущего по умолчанию Locale).

2
ответ дан Community 20 August 2018 в 06:46
поделиться

Часовой пояс является частью среды процесса. Изменение глобального часового пояса для вашей системы влияет только на новые процессы.

См. Также Как установить часовой пояс java.util.Date?:

Имейте в виду, что объекты java.util.Date не содержат информацию о часовом поясе сами по себе - вы не можете установить часовой пояс для объекта Date. Единственное, что содержит объект Date, - это количество миллисекунд с момента «эпохи» - 1 января 1970 года, 00:00:00 UTC.

Как показывает ZZ Coder, вы устанавливаете часовой пояс для объекта DateFormat , чтобы указать, в какой часовой пояс вы хотите отображать дату и время.

2
ответ дан neuhaus 20 August 2018 в 06:46
поделиться
import java.util.Date;

public class DateDemo {
   public static void main(String args[]) {
 //Instantiate a Date object
       Date date = new Date();
 //display time and date using toString()
       System.out.println(date.toString());
   }
}
-3
ответ дан vineeth sivan 20 August 2018 в 06:46
поделиться
  • 1
    Как этот ответ касается вопроса? – neuhaus 10 February 2016 в 11:25
  • 2
    Пожалуйста, улучшите / уточните свой ответ немного больше, чтобы другие могли понять ваш подход к ответу. – Switch 10 February 2016 в 13:08
Другие вопросы по тегам:

Похожие вопросы: