PHP 在 Java 中的 strtotime()
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1268174/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
PHP's strtotime() in Java
提问by User1
strtotime() in PHP can do the following transformations:
PHP 中的 strtotime() 可以做以下转换:
Inputs:
输入:
strtotime('2004-02-12T15:19:21+00:00′);
strtotime('Thu, 21 Dec 2000 16:01:07 +0200′);
strtotime('Monday, January 1st');
strtotime('tomorrow');
strtotime('-1 week 2 days 4 hours 2 seconds');
Outputs:
输出:
2004-02-12 07:02:21 2000-12-21 06:12:07 2009-01-01 12:01:00 2009-02-12 12:02:00 2009-02-06 09:02:41
Is there an easy way to do this in java?
有没有一种简单的方法可以在java中做到这一点?
Yes, this is a duplicate. However, the original question was not answered. I typically need the ability to query dates from the past. I want to give the user the ability to say 'I want all events from "-1 week" to "now"'. It will make scripting these types of requests much easier.
是的,这是一个副本。然而,最初的问题没有得到解答。我通常需要能够查询过去的日期。我想让用户能够说“我想要从“-1 周”到“现在”的所有事件。它将使编写这些类型的请求变得更加容易。
回答by dfa
I tried to implement a simple (static) class that emulates some of the patterns of PHP's strtotime. This class is designed to be open for modification(simply add a new Matchervia registerMatcher):
我试图实现一个简单的(静态)类来模拟 PHP 的一些模式strtotime。这个类被设计为开放修改(只需添加一个新的Matchervia registerMatcher):
public final class strtotime {
private static final List<Matcher> matchers;
static {
matchers = new LinkedList<Matcher>();
matchers.add(new NowMatcher());
matchers.add(new TomorrowMatcher());
matchers.add(new DateFormatMatcher(new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z")));
matchers.add(new DateFormatMatcher(new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z")));
matchers.add(new DateFormatMatcher(new SimpleDateFormat("yyyy MM dd")));
// add as many format as you want
}
// not thread-safe
public static void registerMatcher(Matcher matcher) {
matchers.add(matcher);
}
public static interface Matcher {
public Date tryConvert(String input);
}
private static class DateFormatMatcher implements Matcher {
private final DateFormat dateFormat;
public DateFormatMatcher(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
public Date tryConvert(String input) {
try {
return dateFormat.parse(input);
} catch (ParseException ex) {
return null;
}
}
}
private static class NowMatcher implements Matcher {
private final Pattern now = Pattern.compile("now");
public Date tryConvert(String input) {
if (now.matcher(input).matches()) {
return new Date();
} else {
return null;
}
}
}
private static class TomorrowMatcher implements Matcher {
private final Pattern tomorrow = Pattern.compile("tomorrow");
public Date tryConvert(String input) {
if (tomorrow.matcher(input).matches()) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, +1);
return calendar.getTime();
} else {
return null;
}
}
}
public static Date strtotime(String input) {
for (Matcher matcher : matchers) {
Date date = matcher.tryConvert(input);
if (date != null) {
return date;
}
}
return null;
}
private strtotime() {
throw new UnsupportedOperationException();
}
}
Usage
用法
Basic usage:
基本用法:
Date now = strtotime("now");
Date tomorrow = strtotime("tomorrow");
Wed Aug 12 22:18:57 CEST 2009 Thu Aug 13 22:18:57 CEST 2009
Extending
延伸
For example let's add days matcher:
例如,让我们添加天匹配器:
strtotime.registerMatcher(new Matcher() {
private final Pattern days = Pattern.compile("[\-\+]?\d+ days");
public Date tryConvert(String input) {
if (days.matcher(input).matches()) {
int d = Integer.parseInt(input.split(" ")[0]);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, d);
return calendar.getTime();
}
return null;
}
});
then you can write:
然后你可以写:
System.out.println(strtotime("3 days"));
System.out.println(strtotime("-3 days"));
(now is Wed Aug 12 22:18:57 CEST 2009)
(现在是Wed Aug 12 22:18:57 CEST 2009)
Sat Aug 15 22:18:57 CEST 2009 Sun Aug 09 22:18:57 CEST 2009
回答by e-satis
You can use Simple Date format for such a thing, but you must know the date format before parsing the string. PHP will try to guess it, Java expects you tell him explicitly what to do.
您可以将简单日期格式用于这样的事情,但您必须在解析字符串之前知道日期格式。PHP 会尝试猜测它,Java 期望您明确告诉他要做什么。
Example :
例子 :
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat formater = new SimpleDateFormat("MM/dd/yy");
Date d = parser.parse("2007-04-23 11:22:02");
System.out.println(formater.format(d));
It outputs :
它输出:
04/23/2007
SimpleDateFormat will fail silently if the string is not in the proper format, unless you set :
如果字符串格式不正确,SimpleDateFormat 将静默失败,除非您设置:
parser.setLenient(false);
In that case, it will throws java.text.ParseException.
在这种情况下,它将抛出 java.text.ParseException。
For advance formating, use the DateFormat and it's numerous operators.
对于高级格式化,请使用 DateFormat 及其众多的运算符。
回答by MarrLiss
回答by karim79
Use a Calendar and format the result with SimpleDateFormat:
使用日历并使用 SimpleDateFormat 格式化结果:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html
Calendar now = Calendar.getInstance();
Calendar working;
SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
working = (Calendar) now.clone();
//strtotime("-2 years")
working.add(Calendar.DAY_OF_YEAR, - (365 * 2));
System.out.println(" Two years ago it was: " + formatter.format(working.getTime()));
working = (Calendar) now.clone();
//strtotime("+5 days");
working.add(Calendar.DAY_OF_YEAR, + 5);
System.out.println(" In five days it will be: " + formatter.format(working.getTime()));
Fine, it's significantly more verbose than PHP's strtotime(), but at the end of the day, it's the functionality you're after.
好吧,它比 PHP 的 strtotime() 冗长得多,但归根结底,它是您所追求的功能。
回答by seventeen
As far as I know, nothing like this exists. You would have to hack one together yourself. However, it might not be necessary. Try storing the dates as timestamps and just doing the simple math. I understand this isn't as clean as you might like. But it would work.
据我所知,没有这样的事情存在。你必须自己破解一个。但是,这可能不是必需的。尝试将日期存储为时间戳并进行简单的数学运算。我知道这并不像你想象的那么干净。但它会起作用。

