最近项目里使用到了日历(Calendar),这里模拟一个需求,将遇到的问题进行记录。

需求:根据日历时间进行货品预订,并且只能预订未来一个月内的货品

代码实现

  • java
package com.pan.calendarsample;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.CalendarView;import java.net.URL;import java.net.URLConnection;import java.util.Calendar;import java.util.Date;public class MainActivity extends AppCompatActivity {    private CalendarView calendarView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        calendarView = (CalendarView) findViewById(R.id.calendarView);        initCalendar();    }    private void initCalendar() {        new Thread(new Runnable() {            @Override            public void run() {                URL url = null;                try {                    // 获取网络时间,这里获取淘宝的时间                    url = new URL("http://www.taobao.com");                    URLConnection uc = url.openConnection();                    final long networkTime = uc.getDate();                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            // 预订起始日期                            calendarView.setMinDate(networkTime);                            Calendar calendar = Calendar.getInstance();                            Date date = new Date(networkTime);                            calendar.setTime(date);                            // 预订结束日期                            calendar.add(Calendar.DATE, 30);                            calendar.set(Calendar.HOUR_OF_DAY, 23);                            calendar.set(Calendar.MINUTE, 59);                            calendar.set(Calendar.SECOND, 59);                            long lateTime = calendar.getTimeInMillis();                            calendarView.setMaxDate(lateTime);                        }                    });                } catch (Exception e) {                    e.printStackTrace();                }            }        }).start();    }}
  • xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.pan.calendarsample.MainActivity">    <CalendarView        android:id="@+id/calendarView"        android:layout_width="match_parent"        android:layout_height="match_parent" />RelativeLayout>
  • 效果图

问题

  1. 本地时间和网络时间
    作为一个严谨的项目,千万不能使用本地时间,当用户改动本地时间的时候,项目中的时间也跟着一起变动,这会出现很多问题,比如说,预订多年之前或者之后的货品。这种情况是不允许出现的。所以获取网络时间就很有必要了。可以看这篇博文:获取网络时间

  2. 设置日期范围
    使用Calendar的方法add()进行日期范围设置
    说明:在设置最大选取日期时,发现最后一个日期是黑色可选状态(如上图),但是却无法选中。
    最后在这里找到答案。
    原因:个人猜测,造成这个问题的原因,类似正则表达式中的包含头不包含尾[}。
    解决问题的核心代码:
    设置在时间区间内的时间,这里减少了1秒

    calendar.set(Calendar.HOUR_OF_DAY, 23);calendar.set(Calendar.MINUTE, 59);calendar.set(Calendar.SECOND, 59);

    作的时候发现的坑:
    问题解决后,发现只是减少1秒就可以解决这个问题了,那我换其他方法试试,然后就有了下面的代码

    Calendar calendar = Calendar.getInstance();Date date = new Date(networkTime);calendar.setTime(date);// 设置当天日期calendar.add(Calendar.DATE, 30);// 增加30天的预订时间long endTime = calendar.getTimeInMillis();calendar.setTimeInMillis(endTime - 5*1000);calendarView.setMaxDate(endTime);

    增加30天后,直接减去5秒钟,这样应该就能解决之前的问题了吧。
    后来发现最后一天有时候能选择,有时候不能选择。
    这里直接做原因说明:在初始化界面后的5秒内,可以选择,但是Calendar还是在计时的,5秒过后就不能选择了。这个原因真的很奇葩。

  3. 同步网络时间后改动本地时间
    在按照最上面给出的代码后,时间范围终于不再受本地时间的影响,正当要松口气的时候,突然发现当天的日期竟然没有被选中。
    后来发现是之前本地修改的时间没有修改回来,本地时间还是对程序存在影响。不过,这里只影响当天日期的标示,对预订的时间范围没有影响。

最后问了很多的朋友,目前还没发现解决办法,不知道各位有没有遇到类型情况,还请不吝赐教。

更多相关文章

  1. Android执行shell命令
  2. DatePicker 日期选择控件 DatePickerDialog 日期选择对话框
  3. android 日期对话框
  4. Android中的AlarmManager的使用
  5. android calendar的使用
  6. android获得系统时间(Handler)
  7. Android简易闹钟实现
  8. Android(安卓)时间滚轴
  9. [置顶] android 捕捉异常

随机推荐

  1. Android(安卓)Bundle存储数据类型
  2. android wifi
  3. Android Handler和HandlerThread使用方法
  4. Android(安卓)操作手机内置存储卡中的文
  5. Android ListView用法(1),不用ListActivit
  6. Android Media Scanner Mechanism Analyz
  7. eclipse导入android的jar包
  8. 如何更新Android Studio版本
  9. Android Lights
  10. Android 圆角图片