Оба правильные, но они интерпретируются как даты с двумя разными часовыми поясами. Итак, вы сравнили яблоки и апельсины:
// local dates
new Date("Jul 8, 2005").toISOString() // "2005-07-08T07:00:00.000Z"
new Date("2005-07-08T00:00-07:00").toISOString() // "2005-07-08T07:00:00.000Z"
// UTC dates
new Date("Jul 8, 2005 UTC").toISOString() // "2005-07-08T00:00:00.000Z"
new Date("2005-07-08").toISOString() // "2005-07-08T00:00:00.000Z"
Я удалил вызов Date.parse()
, так как он автоматически используется для строкового аргумента. Я также сравнивал даты с использованием формата ISO8601 , чтобы вы могли визуально сравнивать даты между вашими местными датами и датами UTC. Время разговора составляет 7 часов, что является разницей в часовом поясе и почему ваши тесты показывают две разные даты.
Другим способом создания этих же локальных / UTC-дат будет:
new Date(2005, 7-1, 8) // "2005-07-08T07:00:00.000Z"
new Date(Date.UTC(2005, 7-1, 8)) // "2005-07-08T00:00:00.000Z"
Но я по-прежнему настоятельно рекомендую Moment.js , который как простой, но мощный :
// parse string
moment("2005-07-08").format() // "2005-07-08T00:00:00+02:00"
moment.utc("2005-07-08").format() // "2005-07-08T00:00:00Z"
// year, month, day, etc.
moment([2005, 7-1, 8]).format() // "2005-07-08T00:00:00+02:00"
moment.utc([2005, 7-1, 8]).format() // "2005-07-08T00:00:00Z"
Я предполагаю, что Вы пытаетесь сделать интерфейс команды максимально прощающим. Если это верно, я предлагаю, чтобы Вы использовали алгоритм, подобный этому:
Если язык очень прост как всего
СУЩЕСТВИТЕЛЬНОЕ ГЛАГОЛА
тогда разделение ручными работами хорошо.
, Если это более сложно, необходимо действительно изучить инструмент как ANTLR или JavaCC.
у меня есть учебное руководство на ANTLR (v2) в http://javadude.com/articles/antlrtut , который даст Вам общее представление о том, как он работает.
Когда строка разделителя для команды всегда является той же Строкой или символом (как"";) y рекомендуют использовать класс StrinkTokenizer:
, но когда разделитель варьируется или является сложным y, рекомендует Вам использовать регулярные выражения, которые могут использоваться самим Строковым классом, разделением метода, с тех пор 1.4. Это использует класс Шаблона от java.util.regex пакета
Токенизатор простой строки на пробелах должен работать, но существует действительно много способов, которыми Вы могли сделать это.
Вот пример с помощью токенизатора:
String command = "kick person";
StringTokenizer tokens = new StringTokenizer(command);
String action = null;
if (tokens.hasMoreTokens()) {
action = tokens.nextToken();
}
if (action != null) {
doCommand(action, tokens);
}
Тогда маркеры могут далее использоваться для аргументов. Это все предполагает, что никакие пробелы не используются в аргументах..., таким образом, Вы могли бы хотеть к самокрутке простой механизм парсинга (как получение первого пробела и использование текста прежде как действие или использование регулярного выражения, если Вы не возражаете против хита скорости), просто абстрагируйте его, таким образом, это может использоваться где угодно.
@CodingTheWheel Здесь является Вашим кодом, небольшой уборкой и через затмение ( ctrl + сдвиг + f ) и вставленная спина здесь:)
Включая четыре пробелов впереди каждая строка.
public static boolean simpleNLP(String inputline, String keywords[]) {
if (inputline.length() < 1)
return false;
List<String> lexed = new ArrayList<String>();
for (String ele : inputline.split(" ")) {
lexed.add(ele);
}
boolean status = false;
to = 0;
for (i = 0; i < lexed.size(); i++) {
String s = (String) lexed.get(i);
if (s.equalsIgnoreCase(keywords[to])) {
to++;
if (to >= keywords.length) {
status = true;
break;
}
}
}
return status;
}
Если бы это должно проанализировать командные строки, я предложил бы использовать палата общин Cli .
библиотека Apache Commons CLI обеспечивает API для обработки интерфейсов командной строки.
Другое голосование за ANTLR/ANTLRWorks. Если Вы создаете две версии файла, один с кодом Java для того, чтобы на самом деле выполнить команды, и один без (только с грамматикой), то у Вас есть исполняемая спецификация языка, который является большим для тестирования, блага для документации и большого средства экономии времени, если Вы когда-нибудь решаете портировать его.
Сам Sun рекомендует избегать StringTokenizer и использовать метод String.spilt вместо этого.
Вы также захотите посмотреть на класс Шаблона.
Я посмотрел бы миграции Java из Zork и склонился бы к простому Процессор естественного языка (управляемый или путем маркирования или regex), такой как следующее (из этой ссылки):
public static boolean simpleNLP( String inputline, String keywords[]) { int i; int maxToken = keywords.length; int to,from; if( inputline.length() = inputline.length()) return false; // check for blank and empty lines while( to >=0 ) { to = inputline.indexOf(' ',from); if( to > 0){ lexed.addElement(inputline.substring(from,to)); from = to; while( inputline.charAt(from) == ' ' && from = keywords.length) { status = true; break;} } } return status; }
...
Что-либо, что приводит программисту причину посмотреть на Zork снова, хорошо в моей книге, просто не упустите Grues.
...
Парсинг вручную является большой забавой... вначале:)
На практике, если команды не очень сложны, можно рассматривать их тот же путь как используемые в интерпретаторах командной строки. Существует список библиотек, которыми можно пользоваться: http://java-source.net/open-source/command-line . Я думаю, что можно запустить с апачское свободное городское население CLI , или args4j (использует аннотации). Они хорошо документируются и действительно просты используемый. Они обрабатывают парсинг автоматически и единственную вещь, которую необходимо сделать, должен считать конкретные поля в объекте.
, Если бы у Вас есть более сложные команды, тогда возможно, создавая формальную грамматику, была бы лучшая идея. Существует очень хорошая библиотека с графическим редактором, отладчиком и интерпретатором для грамматик. Это звонило ANTLR (и редактор ANTLRWorks), и это свободно:) Существуют также некоторые грамматики в качестве примера и учебные руководства.
Мне действительно нравятся регулярные выражения. Пока командные строки довольно просты, можно записать несколько regexes, которые могли взять несколько страниц кода для ручного парсинга.
я предложил бы, чтобы Вы проверили http://www.regular-expressions.info для хорошего введения к regexes, а также определенных примеров для Java.
Попробуйте JavaCC парсер-генератор для Java.
Это имеет много функций интерпретации языков, и это хорошо поддерживается на Eclipse.
JCommander кажется неплохим, хотя мне еще предстоит Попробуй это.