Android 时间 日期 相关

By admin in 天文台 on 2019年4月18日

参考
Java日期时间使用计算
Java Calendar,Date,DateFormat,TimeZone,Locale(1)
Calendar

Java Calendar,Date,DateFormat,TimeZone,Locale(二)
本身包装的Calendar接口

Java Calendar,Date,DateFormat,TimeZone,Locale(3)
Date

Java Calendar,Date,DateFormat,TimeZone,Locale(4)
DateFormat

Java Calendar,Date,DateFormat,TimeZone,Locale(5)
SimpleDateFormat

Java Calendar,Date,DateFormat,TimeZone,Locale(6)
Locale

Java Calendar,Date,DateFormat,TimeZone,Locale(7)
TimeZone

一、概念

参考日子标准计算IAT、UT、UTC、欧霉素T、夏令时
1.格林尼治标准时间:格林wich Mean Time(简称 土霉素T)
红霉素T 以格林尼治天文台经线为 0 度经线,将世界分为 二十五个时区,向北时间快,往北时间慢。
UTC是遵照专业的金霉素T提供的精确时间。(在Computer中 林大霉素T 时间和 UTC
时间是千篇一律的)

2.夏令时与冬令时 Daylight Saving 提姆e(简称 DST)
又称“日光节约时制”和“夏令时间”,是壹种为节能而人工规定地点时间的社会制度,在那壹制度举行时期所利用的合并时间称为“夏令时间”。
诚如在天亮早的夏季人工将时间提前1钟头,能够使人早起早睡,减弱照明量,以丰裕利用光照能源,从而节省照明用电。种种选用夏时制的国度现实规定分裂。近期环球有近1十二个国家每年要实践夏令时。
自201一年11月2二十二十五日初始俄罗丝长久使用夏令时,把时间拨快一时辰,不再调回。
大致来讲,使用夏令时和冬令时即在夏日将时刻拨快1个钟头,等到冬日再将时刻拨慢1个时辰。

举个例子计算一下:
借使当前 氯洁霉素T 时间为 一三:00,已知法国巴黎时间为 卡那霉素T+八(法国首都放在东 八区),所以新加坡时间为 一三:00 + 八 = 2一:00。
但当存在夏令时时,会冒出不一样。比如已知吉隆坡时刻为
达托霉素T+3,理论上首尔时光为
16:00,不过出于俄罗丝千古使用夏令时,所以实际圣保罗岁月为 一7:00。

三.花费规范
在实质上支出中,当岁月用于展现时,非特殊供给下壹般接纳系统默许的时区时间作为显示时间。将时间做为数据存款和储蓄或传递给其余系统时(越发是跨平台调用),则最棒利用正式的UTC/红霉素T时间(后边统称威斯他霉素T),除非事先约定或标记了光阴的体系。

因为用户很有望会有改换时区的操作现身,要是使用相应时区的年华戳,并且时间戳作为某种标志量存入了数据库,那么一旦时区暴发改造,已存多大校会与日前时区设置发生难点;而选拔正规时间戳则能够幸免那壹标题,因为经进度序能够很轻易地将时间戳转化为正规时间戳,并且标准时间戳是永远的,那样就能确认保证尽管在修改了时区的景况下,也能正确处理日期时间。

二、Calendar日历 与 Gregorian Calendar公历

参考Java
Calendar类详解

在历史上有着广大种纪元的点子。它们的区别实在太大了,比如说1位的生辰是”二月1028日”
那么一种或然是阳(公)历的十一月10十三日,但也得以是阴(农)历的日期。所感到了计时的联结,必需内定三个日历的取舍。那今后极其普遍和通用的日历就是”格雷戈orian Calendar”。约等于我们在讲述年份时常用 “公元几几年”。Calendar
抽象类定义了足足的方法,让大家能够发挥日历的平整。Java 本人提供了对
“格雷戈orian Calendar” 规则的落到实处。大家从 Calendar.getInstance()
中所获得的实例正是2个 “GreogrianCalendar” 对象(与你通过 new
格雷戈orianCalendar() 得到的结果一律)。

Calendar 在 Java 中是2个抽象类(Abstract Class),格雷戈orianCalendar
是它的一个切实落到实处。

咱俩也足以自身的 Calendar 实现类,然后将它当做 Calendar
对象回来(面向对象的特征)。在 IBM 阿尔法Works 上,IBM
的开荒人士完结了多样日历。同样在
Internet 上,也有对中华公历的落到实处。本文对什么扩张 Calendar
不作斟酌,大家能够经过观测上述 Calendar 的源码来读书。

三、Date DateFormat SimpleDateFormat

java.util.Date
类 Date 表示一定的刹那间,精确到阿秒。从 JDK 壹.壹 初叶,应该使用 Calendar
类达成日期和时间字段之间转移,使用 DateFormat
类来格式化和剖析日期字符串。Date
中的把日子解释为年、月、日、时辰、分钟和秒值的法子已遗弃。

java.text.DateFormat(抽象类)
天文台,DateFormat
是日期/时间格式化子类的抽象类,它以与语言非亲非故的不2秘技格式化并分析日期或时间。日期/时间格式化子类(如
SimpleDateFormat)允许开始展览格式化(也正是日期 ->
文本)、分析(文本-> 日期)和规范。将日期表示为 Date
对象,或然表示为从 GMT(格林尼治标准时间)一九七零 年,一 月 一 日 00:00:00
这一刻起来的微秒数。

java.text.SimpleDateFormat(DateFormat的平素子类)
参考深深通晓Java:SimpleDateFormat安全的时间格式化
SimpleDateFormat
是二个以与语言环境辅车相依的主意来格式化和剖析日期的具体类。它同意开展格式化(日期
-> 文本)、分析(文本 -> 日期)和规范化。
SimpleDateFormat
使得能够挑选其他用户定义的日子-时间格式的格局。然而,依然建议通过
DateFormat 中的 getTimeInstance、getDateInstance 或 getDate提姆eInstance
来新的创设日期-时间格式化程序。

import java.text.SimpleDateFormat;
import java.util.Date;

public class Data {
   public static void main(String[] args) {
      SimpleDateFormat dateFormat =
      new SimpleDateFormat("yyyy-MM-dd E");//可以查API,根据自己的需要显示格式
      Date date = new Date();
      System.out.println("今天的日期是: "+dateFormat.format(date));
   }
}

DateFormat 和SimpleDateFormat 的区别
参考日期操作类(DateFormat与SimpleDateFormat)的不一致和实例
一.DateFormat
能够直接使用,但其本身是二个抽象类,可以依照Locate钦定的区域获得相应的日期时间格式
贰.SimpleDateFormat 类是DateFormat 类的子类,一般境况下来讲 DateFormat
类很少会一向利用。而都应用SimpleDateFormat 类达成。

Locale
参考Locale简介

import java.util.Locale;

public class LocaleOne {
    public static void main(String[] args) {
       Locale myLocale = Locale.getDefault();
       System.out.println(myLocale.getCountry());//CN
       System.out.println(myLocale.getLanguage());//zh
       System.out.println(myLocale.getDisplayCountry());//中国
       System.out.println(myLocale.getDisplayLanguage());//中文
    }
}

与SimpleDateFormat一同利用:

public static final SimpleDateFormat sdfMd = new 
SimpleDateFormat("M/d", Locale.getDefault());
四、在Android中需求特别注意的事项

参考Android中有关日期时间与时区的采取总括

Android中意味日期时间的档次,有Date、Calendar,他们在尚未呈现设置其时区时,取到的方今时刻均为系统暗许时区的时刻,即便给定2个时日,同样是按系统私下认可时区来换算时间,所以说他们都以与时区相关的。SimpleDateFormat对象自作者也是跟时区相关。当使用parse将二个字符串格式的日期调换为Date对象,可能将一个Date对象调换为字符串日期时,这几个字符串日期的时区以SimpleDateFormat关联的时区为准,假若由此setTimeZone修改了时区,则那一个字符串日期以修改后的时区为准。

// 2013-1-31 22:17:14
Date date = new Date(1359641834000L);
System.out.println(date);
String dateStr = "2013-1-31 22:17:14";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
try
{
    //对于已经设定为GMT时间标准的dateFormat来说,
    //一切需要他转换的字符串日期都是GMT标准时间,
    //转换后返回的Date由于默认遵守系统默认时区,
    //所以转换给Date的日期需要+8(例如北京标准时区),
    //也就是时区与标准不同导致的时差。
    Date dateTmp = dateFormat.parse(dateStr);
    System.out.println(dateTmp);
} 
catch (ParseException e) 
{
    e.printStackTrace();  
}  
// Date还是按系统默认时区,而format格式化处来的字符串是GMT,所以要-8。
String dateStrTmp = dateFormat.format(date);  
System.out.println(dateStrTmp);

天文台 1

Paste_Image.png

Calendar在不手动设置时区时,是与系统暗中认可时区相关的。在手动修改时区后,不能够采纳calendar.getTime方法来直接获取Date日期,因为那时候的日子与setTime时的值同样,想要正确获取修改时区后的岁月,应该通过calendar的get方法。

Date date = new Date(1359641834000L);
System.out.println(date);
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));  
//或者可以 Calendar calendar = 
//Calendar.getInstance(TimeZone.getTimeZone("GMT"));  
calendar.setTime(date);
System.out.println(calendar.get(Calendar.HOUR_OF_DAY) + ":" 
+ calendar.get(Calendar.MINUTE));

Calendar calendar2 = Calendar.getInstance();  
calendar2.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));

System.out.println(calendar.getTime());  
System.out.println(calendar2.getTime());

天文台 2

Paste_Image.png

五、DatePickerDialog TimePickerDialog

参考Android中DatePickerDialog对话框和TimePickerDialog对话框的使用

天文台 3

点击开关

天文台 4

弹出选取框

天文台 5

设置完结

package com.lovo;

import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.TimePicker;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 获得设置日期按钮
        Button dateBtn = (Button) findViewById(R.id.btn1);
        // 获得设置时间按钮
        Button timeBtn = (Button) findViewById(R.id.btn2);
        // 为设置日期按钮绑定监听器
        dateBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Calendar c = Calendar.getInstance();
                // 直接创建一个DatePickerDialog对话框实例,并将它显示出来
                new DatePickerDialog(MainActivity.this,
                // 绑定监听器
                        new DatePickerDialog.OnDateSetListener() {

                            @Override
                            public void onDateSet(DatePicker view, int year,
                                    int monthOfYear, int dayOfMonth) {
                                TextView show = (TextView) findViewById(R.id.txt1);
                                show.setText("您选择了:" + year + "年" + monthOfYear
                                        + "月" + dayOfMonth + "日");
                            }
                        }
                        // 设置初始日期
                        , c.get(Calendar.YEAR), c.get(Calendar.MONTH), c
                                .get(Calendar.DAY_OF_MONTH)).show();
            }
        });
        // 为设置时间按钮绑定监听器
        timeBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Calendar c = Calendar.getInstance();
                // 创建一个TimePickerDialog实例,并把它显示出来
                new TimePickerDialog(MainActivity.this,
                // 绑定监听器
                        new TimePickerDialog.OnTimeSetListener() {

                            @Override
                            public void onTimeSet(TimePicker view,
                                    int hourOfDay, int minute) {
                                TextView show = (TextView) findViewById(R.id.txt2);
                                show.setText("您选择了:" + hourOfDay + "时" + minute
                                        + "分");
                            }
                        }
                        // 设置初始时间
                        , c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE),
                        // true表示采用24小时制
                        true).show();
            }
        });
    }
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置日期" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置时间" />

    <TextView
        android:id="@+id/txt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/txt2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 亚洲必赢手机官网 版权所有