【问题标题】:Showing Morning, afternoon, evening, night message based on Time in java在java中显示基于时间的早上,下午,晚上,晚上消息
【发布时间】:2015-02-19 18:51:23
【问题描述】:

我想做什么::

显示消息基于

  • 早上好(12am-12pm)
  • 中午后好(12pm -4pm)
  • 晚上好(下午 4 点到 9 点)
  • 晚安(晚上 9 点到早上 6 点)

代码::

我使用 24 小时格式来得到这个逻辑

private void getTimeFromAndroid() {
        Date dt = new Date();
        int hours = dt.getHours();
        int min = dt.getMinutes();

        if(hours>=1 || hours<=12){
            Toast.makeText(this, "Good Morning", Toast.LENGTH_SHORT).show();
        }else if(hours>=12 || hours<=16){
            Toast.makeText(this, "Good Afternoon", Toast.LENGTH_SHORT).show();
        }else if(hours>=16 || hours<=21){
            Toast.makeText(this, "Good Evening", Toast.LENGTH_SHORT).show();
        }else if(hours>=21 || hours<=24){
            Toast.makeText(this, "Good Night", Toast.LENGTH_SHORT).show();
        }
    }

问题:

  • 这是最好的方法吗,如果不是,这是最好的方法

【问题讨论】:

  • @Devrath 题外话,不应该是 AND && ,您使用的是 OR ||这将导致所有案例(小时 >= 1)都属于早安案例?
  • 你应该知道,小时在023之间的范围内:getHours()
  • @Devrath 我已经更新了答案以考虑到 12:59。
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。进一步适用于ThreeTenABP 中的早期 Android (How to use ThreeTenABP…

标签: java android date time


【解决方案1】:

你应该这样做:

Calendar c = Calendar.getInstance();
int timeOfDay = c.get(Calendar.HOUR_OF_DAY);

if(timeOfDay >= 0 && timeOfDay < 12){
    Toast.makeText(this, "Good Morning", Toast.LENGTH_SHORT).show();        
}else if(timeOfDay >= 12 && timeOfDay < 16){
    Toast.makeText(this, "Good Afternoon", Toast.LENGTH_SHORT).show();
}else if(timeOfDay >= 16 && timeOfDay < 21){
    Toast.makeText(this, "Good Evening", Toast.LENGTH_SHORT).show();
}else if(timeOfDay >= 21 && timeOfDay < 24){
    Toast.makeText(this, "Good Night", Toast.LENGTH_SHORT).show();
}

【讨论】:

  • 我会在底部添加一个 else 大小写以捕获任何意外值 (defensive programming)。
  • @BasilBourque 没错。即使它通知您的支持团队有一个奇怪的边缘案例。关键是不要让应用程序崩溃,因为它不是关键任务。
  • getInstance();需要android api 24。
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的日期时间类现在已被 java.time 类取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。进一步适用于ThreeTenABP 中的早期 Android (How to use ThreeTenABP…
【解决方案2】:

对于正在寻找@SMA 答案的最新 Kotlin 语法的任何人,这里是辅助函数:

fun getGreetingMessage():String{
    val c = Calendar.getInstance()
    val timeOfDay = c.get(Calendar.HOUR_OF_DAY)

    return when (timeOfDay) {
           in 0..11 -> "Good Morning"
           in 12..15 -> "Good Afternoon"
           in 16..20 -> "Good Evening"
           in 21..23 -> "Good Night"
           else -> "Hello"
      }
    }

【讨论】:

    【解决方案3】:

    我会将您的 if/elseif 声明缩短为:

    String greeting = null;
    if(hours>=1 && hours<=12){
        greeting = "Good Morning";
    } else if(hours>=12 && hours<=16){
        greeting = "Good Afternoon";
    } else if(hours>=16 && hours<=21){
        greeting = "Good Evening";
    } else if(hours>=21 && hours<=24){
        greeting = "Good Night";
    }
    Toast.makeText(this, greeting, Toast.LENGTH_SHORT).show();
    

    【讨论】:

    • [+1] 优化
    【解决方案4】:

    java.time

    我建议使用 Java 8 LocalTime。

    也许创建一个这样的类来处理你的时间问题。

    public class GreetingMaker { // think of a better name then this.
    
      private static final LocalTime MORNING = LocalTime.of(0, 0, 0);
      private static final LocalTime AFTER_NOON = LocalTime.of(12, 0, 0);
      private static final LocalTime EVENING = LocalTime.of(16, 0, 0);
      private static final LocalTime NIGHT = LocalTime.of(21, 0, 0);
    
      private LocalTime now;
    
      public GreetingMaker(LocalTime now) {
        this.now = now;
      }
    
      public void printTimeOfDay() { // or return String in your case
        if (between(MORNING, AFTER_NOON)) {
          System.out.println("Good Morning");
        } else if (between(AFTER_NOON, EVENING)) {
          System.out.println("Good Afternoon");
        } else if (between(EVENING, NIGHT)) {
          System.out.println("Good Evening");
        } else {
          System.out.println("Good Night");
        }
      }
    
      private boolean between(LocalTime start, LocalTime end) {
        return (!now.isBefore(start)) && now.isBefore(end);
      }
    
    }
    

    【讨论】:

    • between 测试谓词中的第一个子句应该是 ( ! now.isBefore( start ) ) 以处理现在 start 的时刻。
    • 不确定是否在技术上需要,但为了安全起见,我会在第一个子句周围加上括号,并明确NOT“!”的效果。
    【解决方案5】:

    您确定它是否在第一个区间内,然后所有其他区间取决于上限。所以你可以让它更短:

    String greeting = null;
    if(hours>=1 && hours<=11){
        greeting = "Good Morning";
    } else if(hours<=15){
        greeting = "Good Afternoon";
    } else if(hours<=20){
        greeting = "Good Evening";
    } else if(hours<=24){
        greeting = "Good Night";
    }
    Toast.makeText(this, greeting, Toast.LENGTH_SHORT).show();
    

    【讨论】:

    • 您想在 12:59 说早上好还是下午好?您需要在接受答案之前测试@Devrath。
    • @ almas shaikh .... 你能按照user987339 的建议编辑你的优化答案吗? ........ @ [+1] for user987339 优化
    • @almas sheikh 你是对的。我已经更新了 12:59 的答案
    • 好吧,如果hours0,我不会收到任何问候。
    • 请阅读此JavaDoc
    【解决方案6】:

    试试这个代码(日期类中的获取小时和获取分钟方法已被弃用。)

     private void getTimeFromAndroid() {
        Date dt = new Date();
        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        int hours = c.get(Calendar.HOUR_OF_DAY);
        int min = c.get(Calendar.MINUTE);
    
        if(hours>=1 && hours<=12){
            Toast.makeText(this, "Good Morning", Toast.LENGTH_SHORT).show();
        }else if(hours>=12 && hours<=16){
            Toast.makeText(this, "Good Afternoon", Toast.LENGTH_SHORT).show();
        }else if(hours>=16 && hours<=21){
            Toast.makeText(this, "Good Evening", Toast.LENGTH_SHORT).show();
        }else if(hours>=21 && hours<=24){
            Toast.makeText(this, "Good Night", Toast.LENGTH_SHORT).show();
        }
    }
    

    【讨论】:

      【解决方案7】:

      使用Time4J(或Android 上的Time4A)启用以下不需要任何if-else 语句的解决方案:

      ChronoFormatter<PlainTime> parser =
          ChronoFormatter.ofTimePattern("hh:mm a", PatternType.CLDR, Locale.ENGLISH);
      PlainTime time = parser.parse("10:05 AM");
      
      Map<PlainTime, String> table = new HashMap<>();
      table.put(PlainTime.of(1), "Good Morning");
      table.put(PlainTime.of(12), "Good Afternoon");
      table.put(PlainTime.of(16), "Good Evening");
      table.put(PlainTime.of(21), "Good Night");
      ChronoFormatter<PlainTime> customPrinter=
          ChronoFormatter
            .setUp(PlainTime.axis(), Locale.ENGLISH)
            .addDayPeriod(table)
            .build();
      System.out.println(customPrinter.format(time)); // Good Morning
      

      还有另一种基于模式的方法,让语言环境根据 CLDR 数据以标准方式决定如何格式化时钟时间:

      ChronoFormatter<PlainTime> parser =
          ChronoFormatter.ofTimePattern("hh:mm a", PatternType.CLDR, Locale.ENGLISH);
      PlainTime time = parser.parse("10:05 AM");
      
      ChronoFormatter<PlainTime> printer1 =
          ChronoFormatter.ofTimePattern("hh:mm B", PatternType.CLDR, Locale.ENGLISH);
      System.out.println(printer1.format(time)); // 10:05 in the morning
      
      ChronoFormatter<PlainTime> printer2 =
          ChronoFormatter.ofTimePattern("B", PatternType.CLDR, Locale.ENGLISH)
              .with(Attributes.OUTPUT_CONTEXT, OutputContext.STANDALONE);
      System.out.println(printer2.format(time)); // morning
      

      我所知道的唯一一个也可以做到这一点(但以一种尴尬的方式)的库是 ICU4J。

      【讨论】:

        【解决方案8】:

        对于 Kotlin 用户,他们可以像这样使用它:

        private fun showDayMessage():String {
            val c: Calendar = Calendar.getInstance()
            var message:String ?=null
            val timeOfDay: Int = c.get(Calendar.HOUR_OF_DAY)
            if (timeOfDay >= 0 && timeOfDay < 12) {
                message =  "Good Morning"
            } else if (timeOfDay >= 12 && timeOfDay < 16) {
                message =  "Good Afternoon"
            } else if (timeOfDay >= 16 && timeOfDay < 21) {
                message =  "Good Evening"
            } else if (timeOfDay >= 21 && timeOfDay < 24) {
                message =  "Good Night"
            }
            return  message!!
        }
        

        【讨论】:

          【解决方案9】:

          当我写作时

          Calendar c = Calendar.getInstance();
          int timeOfDay = c.get(Calendar.HOUR_OF_DAY);
          

          我没有得到输出,也没有显示任何错误。只是 timeOfDay 不会在代码中分配任何值。我觉得这是因为在执行Calendar.getInstance() 时出现了一些线程。但是当我折叠线条时,它对我有用。见以下代码:

          int timeOfDay = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
          
          if(timeOfDay >= 0 && timeOfDay < 12){
                  greeting.setText("Good Morning");
          }else if(timeOfDay >= 12 && timeOfDay < 16){
                  greeting.setText("Good Afternoon");
          }else if(timeOfDay >= 16 && timeOfDay < 21){
                  greeting.setText("Good Evening");
          }else if(timeOfDay >= 21 && timeOfDay < 24){
                  greeting.setText("Good Morning");
          }
          

          【讨论】:

            【解决方案10】:
             private String getStringFromMilli(long millis) {
            
                Calendar c = Calendar.getInstance();
                c.setTimeInMillis(millis);
                int hours = c.get(Calendar.HOUR_OF_DAY);
            
                if(hours >= 1 && hours <= 12){
                    return "MORNING";
                }else if(hours >= 12 && hours <= 16){
                    return "AFTERNOON";
                }else if(hours >= 16 && hours <= 21){
                    return "EVENING";
                }else if(hours >= 21 && hours <= 24){
                    return "NIGHT";
                }
                return null;
            }
            

            【讨论】:

              【解决方案11】:

              如果有人对 Dart 和 Flutter 看起来相同:没有 if 语句的代码 - 易于阅读和编辑。

              main() {
                int hourValue = DateTime.now().hour;
                print(checkDayPeriod(hourValue));
              }
              
              String checkDayPeriod(int hour) {
                int _res = 21;
                Map<int, String> dayPeriods = {
                  0: 'Good night',
                  12: 'Good morning',
                  16: 'Good afternoon',
                  21: 'Good evening',
                };
              
                dayPeriods.forEach(
                  (key, value) {
                    if (hour < key && key <= _res) _res = key;
                  },
                );
              
                return dayPeriods[_res];
              }
              

              【讨论】:

                【解决方案12】:
                using System;
                
                namespace PF_Claas_Assign1
                {
                    class Program
                    {
                        static void Main(string[] args)
                        {
                            DateTime Greeting = DateTime.Now;
                
                            if (Greeting.Hour >= 5 && Greeting.Hour < 12)
                            {
                                Console.WriteLine("Good morning....!");
                            }
                            else if (Greeting.Hour >= 12 && Greeting.Hour < 16)
                            {
                                Console.WriteLine("Good afternoon...!");
                            }
                            else if (Greeting.Hour >= 16 && Greeting.Hour < 20)
                            {
                                Console.WriteLine("Good evening...!");
                            }
                            else
                            {
                                Console.WriteLine("Good night...!");
                            }
                        }
                    }
                }
                

                【讨论】:

                • 为什么这比其他答案更好?更不用说它没有实现问题的时间。
                • 感谢您的贡献。该问题被标记为 java,这意味着需要 Java 解决方案。你的是 C# 吗?你也没有回答这个问题。它是:这是最好的方法吗?如果没有,哪种方法最好?
                【解决方案13】:

                在 kotlin 中使用以下

                fun getCurrentTime(dateFormatInPut:String,myDate:String): Time {
                        val sdf = SimpleDateFormat(dateFormatInPut, Locale.ENGLISH)
                        val date = sdf.parse(myDate)
                        val millis = date!!.time
                        val calendar=Calendar.getInstance()
                        calendar.timeInMillis=millis
                        return when (calendar.get(Calendar.HOUR_OF_DAY)) {
                            in 0..11 -> Time.Morning
                            in 12..15 -> Time.AfterNoon
                            else -> Time.Evening
                        }
                
                    }
                

                这里时间是枚举类

                enum class Time {
                Morning,
                AfterNoon,
                Evening
                

                }

                【讨论】:

                  【解决方案14】:

                  检测日期的更简洁的方法是。

                  //the time cannot go below zero, so if this case is true, it must be between 0 and 12
                     if(time <= 12)
                     {
                         return "Good Morning";
                         //it will only fall into this case if the time is greater than 12.
                     }else if(time < 16)
                     {
                         return "Good Afternoon";
                     }else if(time < 21)
                     {
                         return "Good Evening";
                     }else //it is guaranteed that the time will not exceed 24
                         //, and if the previous case are all false, it must be within 21 and 24
                     {
                         return "Good Night";
                     }
                  

                  【讨论】:

                    【解决方案15】:

                    您同样可以拥有一个返回问候语的类。

                    import java.util.Calendar;
                    
                    public class Greetings {
                        public static String getGreetings()
                        {
                            Calendar c = Calendar.getInstance();
                            int timeOfDay = c.get(Calendar.HOUR_OF_DAY);
                    
                            if(timeOfDay < 12){
                                return "Good morning";
                            }else if(timeOfDay < 16){
                                return "Good afternoon";
                            }else if(timeOfDay < 21){
                                return "Good evening";
                            }else {
                                return "Good night";
                            }
                        }
                    }
                    

                    【讨论】:

                    • 仅供参考,存在严重缺陷的日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.
                    • 去掉了大于部分,这看起来与高建清的解决方案非常相似。
                    【解决方案16】:

                    更具体

                    public static String getDayMessage() {
                        Calendar c = Calendar.getInstance();
                        int timeOfDay = c.get(Calendar.HOUR_OF_DAY);
                    
                        if (timeOfDay < 5) {
                            return "Hi, Good Mid Night";
                        }else if (timeOfDay < 6) {
                            return "Hi, Good Late Night";
                        } else if (timeOfDay < 12) {
                            return "Hi, Good Morning";
                        } else if (timeOfDay < 14) {
                            return "Hi, Good Noon";
                        } else if (timeOfDay < 16) {
                            return "Hi, Good Afternoon";
                        } else if (timeOfDay < 21) {
                            return "Hi, Good Evening";
                        } else {
                            return "Hi, Good Night";
                        }
                    }
                    

                    【讨论】:

                    • 几个月前发布的答案已经涵盖了您的方法。如果您的改进是改进,请编辑以描述该改进。如果没有,我建议你删除答案。
                    • 这段代码使用了 terrible Calendar 类,该类在几年前被现代 java.time 类所取代。请参阅 Nahar 的 Answer
                    猜你喜欢
                    • 2019-08-29
                    • 1970-01-01
                    • 2018-10-22
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多