5 ms·
Technically Ruby only accepts seconds. You're thinking of ActiveSupport from Rails.
by mfkp 5y ago
Technically Ruby only accepts seconds. You're thinking of ActiveSupport from Rails.
- inopinatus 5y agoHere's a fun way to annoy a Rails developer. (Time.now + 1.month).to_i == Time.now.to_i + 1.month.to_i #=> false
- irjustin 5y agoNot sure why that's annoying? The right side doesn't really make sense. Though it does seem pretty easy for a novice to do thinking it's the same, but what does 1.month.to_i even mean!?
- lloeki 5y ago> 1.month.to_i Duration of a month in seconds? Before you balk at the idea, there exists a definition of a constant month duration for accounting stuff. I you hate dates - and yourself - try accounting, there's mind boggling stuff that makes the engineer mind recoil in absolute terror.
- inopinatus 5y agoActually taken almost verbatim from the report summarizing a real and subtle bug (distributed across multiple files) in code written by definitely-not-novices.
- neurostimulant 5y agoI'm not really familiar to RoR. Is is due to Time.now getting called twice and each returns slightly different value?
- deleted 5y ago[deleted]
- inopinatus 5y agoAlas, no. It's because ActiveSupport's duration arithmetic is not distributive under conversion. The expression on the left hand side advances time (as a domain object) by exactly a month, then converts the result to integer unix time. The expression on the right adds 2629746¹ to the current unix time. The conversion becomes dangerously magical in the presence of shared code that accepts both object and integer representations of time & duration. A consumer from one part of a system can inadvertently obtain different results to another unless they use identical calling conventions. [1] this is 1/12 of the mean length of a gregorian year² [2] 365.2425 days i.e. 31,556,952 seconds
- neurostimulant 5y agoOh wow. This is totally make sense when you think about it, but something that'll never cross my mind when casually checking the code. I guess this is why python's timedelta doesn't have month unit as the length of a month is highly context dependent.
- ativzzz 5y agoI would just use `1.month.from_now` instead of the additions anyway
- inopinatus 5y agoThat won’t save you; 1.month.from_now is implemented by addition.