java与System.currentTimeMillis()有关,改错

java与System.currentTimeMillis()有关,改错,第1张

1, javalangSystemcurrentTimeMillis(),它返回从 UTC 1970 年 1 月 1 日午夜开始经过的毫秒数

2, UTC是协调世界时(Universal Time Coordinated)英文缩写, UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。

所以上述代码获取的是GMT+0的小时数。而中国在GMT+8,也就是加上8,就是中国的时间了。

给你个java 万年历

import javautilScanner;

public class year {

 public static void main(String[] args) {

     int daysOfMonth=0;    //记录输入日期的那个月有多少天

     int daysOfMonths=0;    //记录输入日期距离输入年份第一天多少天

     int daysOfYears=0;//记录输入日期的那个月的一号距离1900年一月一日多少天

     int month=0;   //记录距离输入的月份

        int year=0;    //记录距离输入的年份

     

     Systemoutprintln(" 欢迎使用万年历 ");

     Scanner input = new Scanner(Systemin); 

         Systemoutprint("输入年份:");

     year = inputnextInt();

     boolean bMonth = year%400==0||year%4==0&&year%100!=0;//输入年份是否为闰年

     do{

      if(month<12){

       Systemoutprint("输入月份:");

       

      }else{

       Systemoutprint("月份出入错误!\n重新输入月份:");

      }

      month = inputnextInt();

     }while(month>12);

 

     switch(month){//计算输入月份有多少天;

     case 2: 

      if(bMonth){

        daysOfMonth=29;

      }else{

       daysOfMonth=28;

      }

      break;

     case 4:

     case 6:

     case 9:

     case 11:

      daysOfMonth=30;

      break;

     default:

      daysOfMonth=31;  

     }

for(int i=1;i<month;i++){//计算输入日期距离输入年份第一天多少天

      switch(i){

      case 2: 

       if(bMonth){

        daysOfMonths+=29;

       }else{

        daysOfMonths+=28;

       }

       break;

      case 4:

      case 6:

      case 9:

      case 11:

       daysOfMonths+=30;

       break;

      default:

       daysOfMonths+=31;  

      }

     }

     for(int i=1900;i<year;i++){//输入年份距离1900年一月一日多少天

      if(i%400==0||i%4==0&&i%100!=0){

       daysOfYears+=366;//366

   }else{

    daysOfYears+=365;//365

   }

          }

     daysOfYears+=daysOfMonths;//daysOfYears现在的值为输入日期的那个月的一号距离1900年一月一日多少天

       

     int xqj=1+daysOfYears%7; //计算输入月份的第一天是星期几

    //开始按照格式输出该月日历

    

          Systemoutprintln("\n星期日\t"+"星期一\t"+"星期二\t"+"星期三\t"+"星期四\t"+"星期五\t"+"星期六");

       for (int i=0;i<xqj;i++){

      Systemoutprint("\t");

        }

       int temp=xqj;//用于计算什么时候是换行,什么时候是输出制表符号

       for (int i=1;i<=daysOfMonth;i++){  //循环输出日期

        temp++;

      if(temp%7!=0){

       Systemoutprint(i+"\t"); 

      }else{

       Systemoutprint(i+"\n");

      }

      

      }

}

}

时区的问题 你在能得到的时间上加8就是北京时间

LocalDate mLocalDate=LocalDatenow();

LocalTime specificTime = LocalTimenow();

这两个代表当地时间 你可以看看

计算机用的是unix纪元,1970年1月1日 0时0分 UTC(协调世界时 即升级版的格林威治时间)

可以说是英国标准时间。

中国是UTC+8 八区,中国本地时间要在以上标准时间上面加8小时。

反映在java的timemilli毫秒时是,

long china_ts=SystemcurrentTimeMillier()+100060608;

但只在不支持Java SE时区的早期版本(比如Java Card,Java ME/MIDP10)才需要自己手工加。

现在的java系统本身有时区库,用Calendar/Date类,会自动调整时区。不需要再手动算。按以上加法会画蛇添足。

这个可以用dwr框架来做,你可以google一下dwr框架,是前台页面通过js直接调用后台方法的轻量级框架。

至于时间算法

1显示本周,那得算出当前周的周一到周7(国外是周日到周六为一周)是几号到几号。 方法是:

private static HashMap<String, String> getWeekByDate() {

HashMap<String, String> dayMap = new HashMap<String, String>();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式

Calendar cal = CalendargetInstance();

calsetTime(new Date());

// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了

int dayWeek = calget(CalendarDAY_OF_WEEK);// 获得当前日期是一个星期的第几天

if (1 == dayWeek) {

caladd(CalendarDAY_OF_MONTH, -1);

}

Systemoutprintln("要计算日期为:" + sdfformat(calgetTime())); // 输出要计算日期

calsetFirstDayOfWeek(CalendarMONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一

int day = calget(CalendarDAY_OF_WEEK);// 获得当前日期是一个星期的第几天

caladd(CalendarDATE, calgetFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值

String imptimeBegin = sdfformat(calgetTime());

Systemoutprintln("所在周星期一的日期:" + imptimeBegin);

dayMapput("Monday", imptimeBegin);

caladd(CalendarDATE, 6);

String imptimeEnd = sdfformat(calgetTime());

Systemoutprintln("所在周星期日的日期:" + imptimeEnd);

dayMapput("SunDay", imptimeEnd);

return dayMap;

}

得到了周一和周日具体是那天,直接去数据库查就OK了,怎么查可以去看下SQL里的between关键字

还有一些写不下,追问一下

最近在使用date命令时,发现表示东8区(中国时区)要使用 GMT-8 ,但在Java中却需要使用 GMT+8 ,如下:

而在Java中,如下:

这就让人有点迷糊了,经过一段时间搜索,发现在时区表达形式上还有不少知识点呢!

众所周知,为了方便各地区本地时间之间的转换,人们将全球划分为了24个时区,以格林尼治天文台(GMT)为零时区,往东西两个方向分别有12个时区,所以自然有了以GMT为前缀的时区表示法,如下:

GMT+8 表示东8区,中国就是使用这个时区,而 GMT-8 表示西8区,如果格林尼治天文台的本地时间是2022-03-19的0点,那么 GMT+8 地区的本地时间就是2022-03-19的8点,而 GMT-8 的本地时间就是往前8小时,即2022-03-18的16点。

注意,上面的各地区本地时间的表述虽然不同,但它们实际是同一个时刻(绝对时间),要理解本地时间与绝对时间的区别。

GMT+8 正是Java中支持的时区表示法,那为啥Linux中却是 GMT-8 呢?实际上Linux中的 GMT-8 也可以写成 Etc/GMT-8 ,这才是它的标准名称,如下:

可以发现用 Etc/GMT-8 的话,Linux与Java的输出都是一样的了,是的, Etc/GMT-8 也是一种类似 GMT+8 的时区表示机制,只不过它的 +- 号是反的。

Ok,虽然上面的差异弄清楚了,但时区的表示形式还没有介绍完,接着往下看

除了 GMT+8 表示方式外,我们还经常会看到 UTC+8 这样的表示方式,这是UTC时区表示法。

即生GMT何生UTC?这是由于GMT是以格林尼治天文台为时间基准,但地球不是完美球体且自转速度在变慢,所以地球自转速度并不均匀,这导致以格林尼治天文台为时间基准是不准的。

为了更准确度量时间,科学家们发明了UTC时间,以铯原子跃迁次数来度量时间,比GMT时间更准确,为了保证GMT的准确性,每隔几年GMT时间会做一次调整,以与UTC时间对齐。

因此,既然有了更准确的UTC,那么就有了以UTC为前缀的时区表示法,如中国时区可使用 UTC+8 。

各时区偏移量表示法一览表,如下:

除了用偏移量来表示时区,为了方便,人们还按区域/城市的方式来定义时区,如 Asia/Shanghai , Asia/Hong_Kong 都表示东8区,具体有哪些城市命名的时区,可以在时区数据库中查看。

另外,为了简化区域时区表示法,又定义了一套时区缩写,如CST是中国时区 China Standard Time 的缩写,可以在时区缩写中查看各种缩写定义。

注意,一般都不建议使用时区缩写,因为时区缩写的命名经常会重复,比如CST是 Central Standard Time (北美中部标准时间UTC -6)、 China Standard Time (中国标准时间UTC +8)、 Cuba Standard Time (古巴标准时间UTC -5)。

由于不同软件对CST的解释可能不同,导致会出现时间相差13或14个小时的情况,这在Java搭配MySQL时经常出现,我还专门写了一篇文章mysql的timestamp会存在时区问题?,对于一定要使用时区缩写的场景,可以使用香港时区缩写 HKT ,它不重复且和上海处于同一个时区。

在Java中和时区相关的类有TimeZone、ZoneId,其中TimeZone是老的时区类,而ZoneId是新的时区类,它有ZoneOffset和ZoneRegion两个子类,分别代表偏移量表示法和区域表示法。

那它们都支持上述的哪些时区写法呢?写个Demo验证一下,如下:

输出如下:

虽然偏移量表示法与区域表示法都可以表示时区,但由于夏令时的存在,它们并不完全等同。

夏令时(Daylight Saving Time: DST),也叫 夏时制,是指为了节约能源,在天亮的早的夏季,人为将时间调快一小时,以充分利用光照资源,节约照明用电。

而中国在 1986 年至 1991 年也实行过夏令时,在1986~1991的每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。

故会有下面看起来有点奇怪的现象:

为什么 Asia/Shanghai 输出为3点,而 GMT+8 输出为2点呢?原因是 1986-05-04 02:00:00 这个时间点中国正开始实行夏令时,时钟拨快了1小时。

而 GMT+8 为什么输出为2点呢?因为中国、马来西亚、菲律宾、新加坡的时区都是 GMT+8 ,只有中国在实行夏令时,而在 GMT+8 中没法感知到区域信息,那java只能以没有实行夏令时的方法来计算本地时间了。

正是由于夏令时的存在,导致程序可能出现诡异的现象甚至bug,如下:

输出如下:

为啥会这样呢?原因是本地时间虽然看起来没变,但 Asia/Shanghai 这个代表的时区却发生了变化。

我们可以将上面 printZonedDateTime 中时间格式由 yyyy-MM-dd HH:mm:ss VV 修改为 yyyy-MM-dd HH:mm:ss VV xxx 再执行,发现输出如下:

如上,夏令时导致 Asia/Shanghai 这个时区不一定是东8区了,也可能是东9区,故Java中,想将ZoneRegion转换为ZoneOffset,需要传递一个instant时刻参数,如下:

夏令时真是一种自欺欺人的做法,还好中国从1991年后就没再实行了!

以上就是关于java与System.currentTimeMillis()有关,改错全部的内容,包括:java与System.currentTimeMillis()有关,改错、java做了一个万年历,但是输出的结果里面星期是中文的,怎么转为英文还有怎么输出其他国家时间、用java.time包中的Clock类得出的当前时间不对等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9685372.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存