Получение даты последнего изменения URL-адреса

#java

#java

Вопрос:

У меня есть три кода. Это первый, в котором я получаю информацию о метаданных любого URL-адреса, и в этих метаданных у меня также есть дата последнего изменения. Если я запускаю этот класс, я получаю дату последнего изменения URL как—

 key:- Last-Modified
value:- 2011-10-21T03:18:28Z
  

Первый

 public class App {

    private static Map<String, String> metaData;    

public static void main(String[] args) {

        Tika t = new Tika();

        Metadata md = new Metadata();
        URL u = null;
        try {
            u = new URL("http://www.xyz.com/documents/files/xyz-china.pdf");

            String content1= t.parseToString(u);
            System.out.println("hello"  content1);
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TikaException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            Reader r = t.parse(u.openStream(), md);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
        for (String name : md.names()){
            String value = md.get(name);
            System.out.println("key:- "  name);
            System.out.println("value:- "  value);
            //getMetaData().put(name.toLowerCase(), md.get(name));
        }
        }
        catch(Exception e) {
            e.printStackTrace();
        }

    }

}
  

Но для второго примера чуть ниже, когда я запускаю этот код и с тем же URL. Я получаю другую дату последнего изменения этого URL-адреса. Как убедиться, какой из них правильный. Поскольку я попытался открыть этот PDF-файл в браузере, но вместо того, чтобы открывать его в браузере. он открывается с помощью Adobe PDF на компьютере, а не в браузере, поэтому я не могу проверить через firebug.

Второй способ—

 public class LastMod{
  public static void main(String args[]) throws Exception {
    URL url = new URL("http://www.xyz.com/documents/files/xyz-china.pdf");

    System.out.println("URL:- "  url);
    URLConnection connection = url.openConnection();


    System.out.println(connection.getHeaderField("Last-Modified"));
    }
}
  

Для приведенного выше я получаю дату Las Mod как-

 Thu, 03 Nov 2011 16:59:41  0000
  

Третий способ—

 public class Main{
  public static void main(String args[]) throws Exception {
    URL url = new URL("http://www.xyz.com/documents/files/xyz-china.pdf");
    HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();

    long date = httpCon.getLastModified();
    if (date == 0)
      System.out.println("No last-modified information.");
    else
      System.out.println("Last-Modified: "   new Date(date));

 }
}
  

И с помощью третьего метода я получаю это так—

 Last-Modified: Thu Nov 03 09:59:41 PDT 2011
  

Я не понимаю, какой из них правильный. Я думаю, что первый правильный. Любые предложения будут оценены..

Ответ №1:

Лучшим вариантом является третий — connection.getLastModified() , потому что это самый простой в использовании метод и имеет самый высокий уровень абстракции. Все остальные находятся на более низких уровнях абстракции: первый считывает необработанный ответ, а второй — необработанный заголовок. Третий считывает заголовок и преобразует его в long .

Разница между выводами связана с часовым поясом. При использовании new Date() используется часовой пояс виртуальной машины по умолчанию. Предпочитайте Calendar или best — joda-time DateTime , которые поддерживают пользовательские часовые пояса.

Комментарии:

1. итак, вы уверены, что с помощью третьего метода я получаю правильную дату последнего изменения.. Поскольку я не могу это понять…

Ответ №2:

Первая часть кода извлекает дату из метаданных файла PDF, в то время как две другие получают информацию из HTTP-заголовков, возвращаемых веб-сервером. Первый, вероятно, более точный, если вы хотите знать, когда документ был создан / изменен.

Ответ №3:

Дата последнего изменения должна быть в GMT (RFC 2822), поэтому вы должны получить ее следующим образом:

 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
Long dateTime = connection.getLastModified();
connection.disconnect();
ZonedDateTime urlLastModified = ZonedDateTime.ofInstant(Instant.ofEpochMilli(dateTime), ZoneId.of("GMT"));