2012-08-15 40 views
0

所以在PHP中我有一些代码,提取日,月,年为整数,这样的事情:PHP和Ruby:解析日期

// Grab the Date 
    $date = date("mdy"); 
    $day = (int) substr($date, 2, 2); 
    $month = (int) substr($date, 0, 2); 
    $yr = (int) substr($date, 4); 

我想要做的红宝石一样。我以为我找到了

# Grab the Date 
    now = Date.new(Time.now).to_date 
    date = Date.parse(now) 
    day = date.mday 
    month = date.mon 
    yr = date.year 

我试过这个主题,每次失败,呼吁星期二8月14日01:16

私有方法`TO_DATE的时间变化的答案:00 -0600 2012:时间(NoMethodError)

我确定答案是在网络上的某个地方,但我没有向Google提出正确的问题,因为我没有找到它。我只在Ruby中编写了几个月的代码,我认为这很简单。那么我错过了什么?

感谢

回答

1

我觉得你只是想:

now = Time.now 

day = now.mday 

month = now.mon 

yr = now.year 

顺便说一句,你可以做到这一点更干净,没有substr()操作,在PHP中:

$date = new DateTime; 

$day = (int) $date->format('j'); 

$month = (int) $date->format('n'); 

$year = (int) $date->format('Y'); 
+0

这正是我在当前应用程序中寻找的内容。我还没有测试@ Catnapper的建议,但我也喜欢它。我一直忘记你可以在Ruby中扩展类。至于PHP的部分去...我想我的代码是尽可能瘦 - 一个单一的8字符串的日期和substr提取。我认为PHP有​​类似你使用的类。但是,我认为你在做什么会占用更多的内存和CPU时间。差别可能可以忽略不计,但我倾向于运行数百个并发任务,所以我尽量将事情保持在我知道如何处理的地方。 – 2012-08-15 15:12:01

+0

是的,很酷,你可以在Ruby中动态修改类。我可能会在PHP中做一点不同于你的第一个地方(不确定上下文是什么)。但我认为我所建议的是一种更清晰的方式,以最终达成你想要的变革。不知道CPU(我可以看到它会以任何方式)。可能会消耗更多的内存,尽管您可以在提取值之后清除对象:'unset($ date)'。我可以想象,在许多情况下,这两种方法的差别都可以忽略不计,远远超过了更优雅的代码,但我不知道你的具体情况。 – JMM 2012-08-15 21:48:53

+0

我认为在这种情况下资源问题可以忽略不计。这更多的是习惯问题。也就是说,我通常会尝试编写健壮且易于阅读的代码。在大多数情况下,我不会使用没有相关注释的substr命令,比如“从中提取诸如此类”。在这种情况下,变量名称表现得相当好。而且,我猜测,即使可以衡量,资源使用的差异也是最小的。那么我们只是在编码风格上偏好。 - 谢谢 – 2012-08-16 07:00:54

1
require 'date'  
def date_to_array date = Date.today 
    [date.year, date.mon, date.mday] 
end 

或者,也许,如果您在应用程序的所有位置使用它,请延长Date:

require 'date' 
class Date 
    def to_a 
    [self.year, self.mon, self.mday] 
    end 
end 
+0

我给你一个投票,但答案。我喜欢这个建议,但这不是我想要的这段代码。感谢提醒我可以在Ruby中扩展类。 – 2012-08-15 15:13:24

+0

@Gabe我认为在PHP中为数据建议其他格式,但决定只是复制你正在使用的变量。一个类似于@Catnapper在这里的想法是'$ date = explode(“ - ”,$ date-> format('jny'))',但如果要定义一个方法的麻烦,我宁愿返回一个assoc数组(哈希)。你可以这样做:'$ date = array_combine(array('day','month','year'),explode(“ - ”,$ date-> format('j-n-y')))''。 PHP的'getdate()'是完美的,只是它没有TZ参数,并且在本地时间(ugh)声明了值。太糟糕了没有equiv。方法在DateTime上。 – JMM 2012-08-15 21:57:12

1

有很多你可以做的日期操纵,寻找更多的Documentation!但请不要使用带有重音的红宝石:)

require 'date' 

Date.new(2001,2,3).year 
#=> 2001 

Date.new(2001,2,3).yday 
#=> 34 Returns the day of the year (1-366) 

Date.today.day 
#=> 14 

date = Date.new(2008, 12, 22) 
date.day 
#=> 22 
date.month 
#=> 12 
date.year 
#=> 2008 

Date.new(2001,2,3).strftime '%Y' 
#=> "2001"