В этом примере кода используются 3 часовых пояса (EST, PST, EET). Для каждого часового пояса создается объект Date и запускается toString() для вывода используемого формата. Затем это же строковое значение передается конструктору и используется для создания нового объекта даты. Код выполняет проверку, чтобы убедиться, что используемый часовой пояс действителен.
Все 3 часовых пояса (EST, PST, EET) действительны, но при создании объекта исключение java.lang.IllegalArgumentException возвращается только для EET.
import java.util.*;
import java.text.*;
public class DateTest
{
public static void main (String[] args)
{
System.out.println("=======Test 1 : using EST=======");
isValidTimeZone("EST");
TimeZone.setDefault(TimeZone.getTimeZone("EST"));
runTest();
System.out.println("=======Test 2 : using PST=======");
isValidTimeZone("PST");
TimeZone.setDefault(TimeZone.getTimeZone("PST"));
runTest();
System.out.println("=======Test 3 : using EET=======");
isValidTimeZone("EET");
TimeZone.setDefault(TimeZone.getTimeZone("EET"));
runTest();
}
private static void isValidTimeZone(String tz)
{
String[] validIDs = TimeZone.getAvailableIDs();
boolean validTZ = false;
for (String str : validIDs) {
if (str != null && str.equals(tz)) {
validTZ = true;
break;
}
}
if (validTZ)
{
System.out.println(tz + " is a Valid Time Zone");
}
else
{
System.out.println(tz + " is **NOT** a Valid Time Zone");
}
}
private static void runTest()
{
try
{
String myDateString = new Date().toString();
System.out.println(" Default Date String : " + myDateString);
MyObjectWithADate myObject = new MyObjectWithADate(new Date(myDateString));
}
catch(Exception e)
{
System.out.println(" Object NOT Created!!!!!");
e.printStackTrace(System.out);
}
}
}
public MyObjectWithADate (Date eventDate)
{
System.out.println(" Passed in Date : " + eventDate.toString());
// this.eventDate = eventDate;
try {
this.eventDate = DateFormat.getInstance().parse(eventDate.toString());
System.out.println(" Object Created");
} catch (ParseException e) {
System.out.println(" Object NOT Created");
e.printStackTrace();
}
}
}
Вот результат.
Основываясь на документах Java 11, он комментирует, что Date устарела и что следует использовать DateFormat.parse().
В качестве теста код объекта был изменен для использования DateFormat.parse, но это только ухудшило ситуацию.
public MyObjectWithADate (Date eventDate)
{
System.out.println(" Passed in Date : " + eventDate.toString());
// this.eventDate = eventDate;
try {
this.eventDate = DateFormat.getInstance().parse(eventDate.toString());
System.out.println(" Object Created");
} catch (ParseException e) {
System.out.println(" Object NOT Created");
e.printStackTrace();
}
}
}
Вот новые результаты.
Вопросы 1. Из какой переменной среды JVM получает часовой пояс?
Вопрос 2. Почему при использовании исходного кода возникает исключение, когда используется тот же формат, что и в JVM?
Вопрос 3. Что именно такого в EET, что вызывает его сбой, а также EST и PST и их замену без проблем?
Вопрос 4. Если я хочу, чтобы исходный код мог запускаться кем угодно в любом часовом поясе, что нужно изменить?
ОТРЕДАКТИРОВАНО ДЛЯ ДОБАВЛЕНИЯ СЛЕДУЮЩЕГО:
Приведенный выше код представляет собой уменьшенную модель. К сожалению, фактический код не может быть изменен во всех местах, чтобы изменить использование объекта Date.
Я провел еще один тест, используя SimpleDateFormat в объекте MyObjectWithADate. Это снова работает для EST и PST, но не для EET.
class MyObjectWithADate
{
private Date eventDate;
public MyObjectWithADate (Date eventDate)
{
System.out.println(" Passed in Date : " + eventDate.toString());
String datePattern = new String ("E MMM dd HH:mm:ss z yyyy");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
try {
this.eventDate = simpleDateFormat.parse(eventDate.toString());
System.out.println(" Object Created");
} catch (ParseException e) {
System.out.println(" Object NOT Created");
e.printStackTrace();
}
System.out.println(" Object Created");
}
}
Я начинаю думать, что мой первоначальный вопрос должен был быть, как взять следующую строку
Пт 26 марта 21:42:52 EET 2021
и поместите его в объект Date.
TimeZone
,Date
иDateFormat
. Эти классы плохо спроектированы и давно устарели, последний, в частности, печально известен своими трудностями. Вместо этого используйте java.time, современный API даты и времени Java. - person Ole V.V.   schedule 26.03.2021Continent/Region
, напримерAmerica/Los_Angeles
,Africa/Tunis
иPacific/Auckland
. EST, PST, EET не являются часовыми поясами. - person Basil Bourque   schedule 26.03.2021