Ответ 1
Первая часть кода извлекает дату из метаданных PDF файла, а две другие получают информацию из заголовков HTTP, возвращаемых веб-сервером. Первый, вероятно, более точен, если вы хотите знать, когда документ был создан/изменен.
У меня есть три кода. Это первый, в котором я получаю информацию о метаданных любого URL-адреса и в этих метаданных также имею дату LastModified. Если я запустил этот класс, я получаю последнюю измененную дату 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
Я путаю, какой из них прав. Я думаю, что сначала правильно. Любые предложения будут оценены.
Первая часть кода извлекает дату из метаданных PDF файла, а две другие получают информацию из заголовков HTTP, возвращаемых веб-сервером. Первый, вероятно, более точен, если вы хотите знать, когда документ был создан/изменен.
Лучший вариант - третий - connection.getLastModified()
, потому что это самый простой в использовании метод и имеет самый высокий уровень абстракции. Все остальные находятся на более низких уровнях абстракции: первый считывает исходный ответ, а второй считывает исходный заголовок. Третий читает заголовок и преобразует его в длинный.
Разница между выходами связана с часовым поясом. Используя new Date()
, вы используете часовой пояс VM по умолчанию. Предпочитаете Календарь или лучше - joda-time DateTime
, которые поддерживают пользовательские часовые пояса.
Последняя измененная дата должна быть в GMT (RFC 2822), поэтому вы должны получить ее так:
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
Long dateTime = connection.getLastModified();
connection.disconnect();
ZonedDateTime urlLastModified = ZonedDateTime.ofInstant(Instant.ofEpochMilli(dateTime), ZoneId.of("GMT"));