Так что просто добавить немного обновления здесь.Ответы, которые дали люди, очень помогли, и теперь у меня есть код, который делает именно то, что я хочу, но термин «наследие» в одном из комментариев дает мне понять, что может быть лучший и более продолжительный путь.Вот что в настоящее время происходит в коде.
1) Я получаю футбольное приспособление, которое поставляется с датой String utc в форме 2018-09-22T11:30:00Z
2) Затем я анализирую дату, используя SimpleDateFormat convertUtcDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
и convertUtcDate.setTimeZone(TimeZone.getTimeZone("GMT"));
3) Затем я получаю текущее время, используя currentTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
, и сравниваю их, используя if(convertedDate.after(currentTime))
, чтобы найти следующий отряд команды.В этот момент я обнаружил, что устройство будет иметь эти две даты в одной и той же форме, либо с BST, либо с GMT + 01: 00, но в любом случае эти даты можно точно сравнить.
4) Затем я форматируюдата, поэтому она выражается в виде смещения по Гринвичу с использованием SimpleDateFormat convertToGmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
и String dateString = convertToGmt.format(convertedDate);
5) Для даты utc в 1) возвращается Sat Sep 22 12:30:00 GMT+01:00 2018
независимо от устройства.Обратите внимание, что время отличается от даты utc.Не совсем уверен, почему это так (может быть потому, что парень, работающий с API, находится в Германии, что на час впереди меня здесь, в Англии), но важно то, что это время правильное (это относится к Фулхэму - Уотфордузавтрашняя игра, которая действительно в 12:30 BST / GMT + 01: 00).
6) Затем я отправляю эту строку вместе с несколькими другими частями информации о приборе в Firebase.На этом этапе важно, чтобы дата была в форме GMT + 01: 00, а не в BST, потому что другие устройства могут не распознавать форму BST, когда они читают эту информацию.
7) Когда речь идет о вызове,Возвращая информацию из Firebase, я преобразовываю ее обратно в дату, анализируя ее с помощью SimpleDateFormat String2Date = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.US);
, а затем я могу расположить приборы в хронологическом порядке, сравнивая их даты.
Я просто хотел бы повторить, что этот метод работает,Я проверил время, когда часовой пояс в Англии меняется на GMT + 00: 00, и он все еще работает нормально.Я постарался убедиться, что все сделано в терминах GMT, чтобы оно работало где угодно.Хотя я не могу быть уверен, что это будет так.Кто-нибудь видит какие-либо недостатки в этом методе?Можно ли это улучшить?
Редактировать: Вот фрагмент кода, который, я надеюсь, просто и точно отражает то, что я делаю.
public class FragmentFixture extends Fragment {
SimpleDateFormat convertUtcDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
SimpleDateFormat String2Date = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.US);
SimpleDateFormat convertToGmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
private List<Fixture> fixtureList;
Date date1;
Date date2;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
convertUtcDate.setTimeZone(TimeZone.getTimeZone("GMT"));
fixtureList = new ArrayList<>();
// retrieve fixtures from API and get date for a certain fixture. I will provide an example
String date = "2018-09-22T11:30:00Z";
Date convertedDate = new Date();
try {
convertedDate = convertUtcDate.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
Date currentTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
if (convertedDate.after(currentTime)) {
String dateString = convertToGmt.format(convertedDate);
Fixture fixture = new Fixture(dateString);
fixtureList.add(fixture);
Collections.sort(fixtureList, new DateSorter());
}
}
public class DateSorter implements Comparator<Fixture> {
@Override
public int compare(Fixture fixture, Fixture t1) {
try {
date1 = String2Date.parse(fixture.getDate());
} catch (ParseException e) {
e.printStackTrace();
}
try {
date2 = String2Date.parse(t1.getDate());
} catch (ParseException e) {
e.printStackTrace();
}
return date1.compareTo(date2);
}
}
public class Fixture {
public String date;
public Fixture() {
}
public Fixture(String date) {
this.date = date;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
}