PHP的strtotime()在Java中

在PHP中strtotime()可以做以下转换:

input:

的strtotime('2004-02-12T15:19:21 + 00:00');
 strtotime('Thu,21 Dec 2000 16:01:07 +0200');
 strtotime(“1月1日星期一”);
的strtotime( '明天');
 strtotime(' -  1周2天4小时2秒');

输出:

 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

在java中有这样一个简单的方法吗?

是的,这是重复的 。 但是,原来的问题没有回答。 我通常需要能够查询过去的date。 我想让用户能够说'我希望所有事件从“-1周”到“现在”“。 这将使脚本这些types的请求更容易。

我试图实现一个简单的(静态)类来模拟PHP的strtotime一些模式。 这个类被devise为可以修改 (只需通过registerMatcher添加一个新的Matcher ):

 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(); } } 

用法

基本用法:

  Date now = strtotime("now"); Date tomorrow = strtotime("tomorrow"); 
星期三8月12日22:18:57 CEST 2009
 Thu Aug 13 22:18:57 CEST 2009

扩展

例如,让我们添加天匹配器

 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; } }); 

那么你可以写:

 System.out.println(strtotime("3 days")); System.out.println(strtotime("-3 days")); 

(现在是Wed Aug 12 22:18:57 CEST 2009

星期六8月15日22:18:57 CEST 2009
 Sun Aug 09 22:18:57 CEST 2009

你可以使用简单的date格式来处理这样的事情,但是在分析string之前你必须知道date格式。 PHP会试图猜测它,Java期望你明确地告诉他该做什么。

例如:

 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)); 

它输出:

 04/23/2007 

如果string格式不正确,SimpleDateFormat将自动失败,除非您设置:

 parser.setLenient(false); 

在这种情况下,它会抛出java.text.ParseException。

为了提前格式化,使用DateFormat,它是众多的操作符 。

看看JodaTime ,我认为这是Java的最佳date时间库。

使用日历并使用SimpleDateFormat格式化结果:

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())); 

很好,它明显比PHP的strtotime()更详细,但在一天结束的时候,它就是你所追求的function。

据我所知,没有这样的存在。 你必须自己破解一个。 但是,这可能没有必要。 尝试存储date作为时间戳,只是做简单的math。 我知道这不是你想要的那么干净。 但它会工作。