Project

General

Profile

Actions

Feature #21533

open

Introduce `Time#am?` and `Time#pm?`

Added by matheusrich (Matheus Richard) 1 day ago. Updated about 7 hours ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:122925]

Description

This proposal adds two predicate methods to Time:

Time.utc(2000, 1, 1, 11, 59, 59).am? # => true
Time.utc(2000, 1, 1, 12, 0, 0).pm?   # => true
  • am? returns true when the hour is less than 12.
  • pm? returns true when the hour is 12 or greater.

These methods provide a clear and expressive way to branch logic based on time of day. For example:

def reminder_deferral_options
  options = []
  options << ["Later today", "later_today"] if Time.now.am?
  options << ["Tomorrow morning", "tomorrow_morning"]
  options << ["Pick a date/time…", "custom"]
  options
end

This is a common pattern in applications involving reminders and scheduling. The
method names are intuitive, and the semantics are well understood.

The implementation is in this Pull Request.

Updated by nobu (Nobuyoshi Nakada) 1 day ago

I'm not against the methods themselves, since there are similar methods such as monday?, tuesday?, and so on.
(no january?, february?, etc though)

But your example, selecting by am?, seems less convincing.

What will you do if the criteria is changed, or more options are added?
Add morning?, daytime?, and others?

def reminder_deferral_options
  now = Time.now
  options = []
  options << ["Around noon", "around_noon"] if now.morning?
  options << ["Later today", "later_today"] if now.am?
  options << ["Tonight", "tonight"] if now.daytime?
  options << ["Tomorrow morning", "tomorrow_morning"]
  options << ["Pick a date/time…", "custom"]
  options
end

Updated by matheusrich (Matheus Richard) 1 day ago · Edited

@nobu (Nobuyoshi Nakada) totally fair questioning. In fact, my initial idea was to propose Time#morning? (hour between 6...12) but I wasn't sure that would be true for all cultures.

Time#am?/pm? are enough for my use case, and I think they have value in themselves.

I'd be happy to introduce any other methods like daytime?/nighttime?, but I think those are prone to bikeshedding for what day/night/morning means. Am/pm are clearly defined and might be enough most of the time?

Updated by nobu (Nobuyoshi Nakada) about 8 hours ago

matheusrich (Matheus Richard) wrote in #note-2:

@nobu (Nobuyoshi Nakada) (Nobuyoshi Nakada) totally fair questioning. In fact, my initial idea was to propose Time#morning? (hour between 6...12) but I wasn't sure that would be true for all cultures.

It varies by cultures.

I'd be happy to introduce any other methods like daytime?/nighttime?, but I think those are prone to bikeshedding for what day/night/morning means.

Agree.
We would need methods to calculate the sunrise/sunset times for a specified date and location.

Am/pm are clearly defined and might be enough most of the time?

Cleary defined -- probably yes.
Enough most of the time -- depends on cultures probably.

In any case, I'm not against (neutral or slightly positive) this proposal itself, as wrote previously.

Updated by mame (Yusuke Endoh) about 7 hours ago

I'm not strongly opposed, but I have a slight doubt about noon.pm? returning true.

According to NIST, designating noon as either a.m. or p.m. is technically incorrect:

https://www.nist.gov/pml/time-and-frequency-division/times-day-faqs

To illustrate this, consider that "a.m." and "p.m." are abbreviations for "ante meridiem" and "post meridiem," which mean "before noon" and "after noon," respectively. Since noon is neither before noon nor after noon, a designation of either a.m. or p.m. is incorrect. Also, midnight is both twelve hours before noon and twelve hours after noon.

A quick search for "12 p.m. noon" also brings up many articles and discussions arguing against the usage. I'm curious what others think.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0