java调用命令行校对系统时间
电脑时间长了发现系统时间不准确,每次手动调整太麻烦,就自己写个程序校正一下
首先linux下设置时间 date -s "2023-01-29 11:12:13",普通执行没问题,放到java里字符串注意转义引号
另外date命令比较高级需要权限,所以直接执行是不行的,java本身是有限权限,折腾了很久发现还是在外面高权限调用java更快捷
java直接运行class,发现文件名不需要.class就可以,有包名的时候注意路径免得报找不到类错误
最后说一下思路,本来校时可以 sudo rdate -s time.nist.gov,但校时服务器不一定在线,就自己随便找个著名服务器curl访问一下,加上-i参数就会返回一个gmt时间,读取返回数据查找到时间行,然后把时间转换为本地时间配合当天日期调用命令date设置一下,注意curl和date调用命令用string和string[],那是因为date命令里有更复杂参数就用数组参数了
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.SequenceInputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// https://blog.csdn.net/lanlangaogao/article/details/120827047
public class ChangeTime {/*** 运行外部命令并获得返回结果** @param command 需要运行的外部命令* @return 合并标准输出和错误输出的返回结果*/public static StringBuilder buildProcess(String[] command) {StringBuilder builder = new StringBuilder();try {Process process = Runtime.getRuntime().exec(command);try (SequenceInputStream input = new SequenceInputStream(process.getInputStream(),process.getErrorStream());BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {String msg;while ((msg = reader.readLine()) != null) {builder.append(msg);builder.append(System.lineSeparator());System.out.println(msg);}process.waitFor();process.destroy();} catch (InterruptedException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}return builder;}public static String exeProcess(String command) {String builder = "";try {Process process = Runtime.getRuntime().exec(command);System.out.println(command);try (SequenceInputStream input = new SequenceInputStream(process.getInputStream(),process.getErrorStream());BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {String msg;while ((msg = reader.readLine()) != null) {if (msg.startsWith("Date:")) {builder = msg;break;}System.out.println(msg);}process.waitFor();process.destroy();} catch (InterruptedException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}return builder;}public static String runProcess(String[] command) {StringBuilder builder = buildProcess(command);if (builder.length() == 0) {return "";} else {return builder.substring(0, builder.length() - System.lineSeparator().length());}}public static String Time_Pattern = "HH:mm:ss";public static String Day_Pattern = "yyyy-MM-dd";/*** @param timePattern yyyy-MM-dd HH:mm:ss.SSSXXX*/public static String utcToLocal(String utcTime, String timePattern) {SimpleDateFormat utcFormater = new SimpleDateFormat(timePattern);utcFormater.setTimeZone(TimeZone.getTimeZone("UTC"));//时区定义并进行时间获取Date gpsUTCDate = null;try {gpsUTCDate = utcFormater.parse(utcTime);} catch (ParseException e) {return utcTime;}SimpleDateFormat localFormater = new SimpleDateFormat(timePattern);localFormater.setTimeZone(TimeZone.getDefault());String localTime = localFormater.format(gpsUTCDate.getTime());return localTime;}private static String[] getCommand(String command) {String os = System.getProperty("os.name");String shell = "/bin/bash";String c = "-c";if (os.toLowerCase().startsWith("win")) {shell = "cmd";c = "/c";}String[] cmd = {shell, c, command};System.out.println(command);return cmd;}public static void main(String[] args) {String builder = exeProcess("curl -i www.baidu.com");System.out.println(builder);for (String str : builder.split(" ")) {if (str.indexOf(":") > 0 && str.indexOf(":") < 3) {String str2 = utcToLocal(str, Time_Pattern);SimpleDateFormat localFormater = new SimpleDateFormat(Day_Pattern);Date now = new Date();String newDate = localFormater.format(now) + " " + str2;System.out.println(newDate);StringBuilder cmdBuilder = new StringBuilder(); cmdBuilder.append("date -s \"");cmdBuilder.append(newDate+"\""); String runProc = runProcess(getCommand(cmdBuilder.toString()));System.out.println(runProc);break;}}}
}
就校时这一块常用的ntp服务,试了几次都没成功 服务器列表 - 全球可用的NTP服务器列表与解析服务 - ntp.org.cn & ntpdate.net
后来网上看到deepin系统自带校时服务,更新/etc/systemd/timesyncd.conf ntp服务地址
比如
cn.pool.ntp.org
然后service systemd-timesyncd start,就启动了系统自己的校时,然后可以看这个服务状态
service systemd-timesyncd status
java调用命令行校对系统时间相关推荐
- java调用命令行命令_Java命令行界面(第4部分):命令行
java调用命令行命令 我的Java命令行解析系列的第四部分介绍了Commandline ,它被描述为 "用于解析命令行参数的Java库",它"基于使用注释从命令行参数到 ...
- java 调用命令行
java 调用命令行 JAVA Runtime类 java调用命令行 1. java调用终端,使用命令"javac" 2. java调用终端,使用javac编译helloWorld ...
- Java调用命令行+java生成词云
java调用命令行 package com.weizu.control; import java.io.BufferedReader; import java.io.InputStreamReader ...
- windows下命令行修改系统时间;修改系统时间的软件
找了很久,都没有找到,还找了关键词 dos下修改系统时间 因为看到linux下修改系统时间是用hwclock 命令写入主板芯片. 而我由于某些原因想自动化修改系统时间,所以找windows下修改系统时 ...
- Java中命令行调用大坑
Java中命令行调用大坑 背景 我司有一个查询服务接口机,QPS大概40~50,调用方式是Java调用Shell命令行的方式,核心代码如下: Process ps = Runtime.getRunti ...
- 命令行 修复系统_让我们修复旧的命令行
命令行 修复系统 by Manuel Vila 通过曼努埃尔·维拉(Manuel Vila) 让我们修复旧的命令行 (Let's fix the good old command line) Alth ...
- 介绍Java -D 命令行参数
介绍Java -D 命令行参数 我们在ide中执行程序经常需要设置VM参数,运行maven命令也需要设置参数,都是通过-D设置参数值.本文带你了解-D命令行参数. 1. 什么是Java -D命令行参数 ...
- JAVA 的命令行运行
作者:孙英鹏 撰写时间:2019年4月18日 JAVA 的命令行运行 今天要讲的是如何在命令行里进行打印运行.说明(此方法是老师的上课内容,我重新理解一遍) 首先创建一个文本文档,放在一个文件夹里,文 ...
- Java jar 命令行运行程序如何引用第三方依赖包
1 引言 mybatis generator 是一个命令行运行工具,可以生成 mybatis 代码.但它需要依赖数据库驱动 jar,否则会抛出 ClassNotFoundException 异常. E ...
最新文章
- Python中numpy模块的简单使用
- 怎么用python读取csv文件、并且是读取行-使用python获取csv文本的某行或某列数据的实例...
- Safari下弹窗问题的解决办法
- Javascript跳转页面和打开新窗口等方法
- 安装SQL提示重启电脑失败,解决办法
- apigee 安装_APIGEE:用于API代理的CI / CD管道
- JavaScript-面试 表单验证
- T-SQL笔记7:临时表和表变量
- cygwin-1.7 离线安装包_【软件安装管家】ArcGIS 10.7 软件安装包+安装教程
- 【数据库原理实验(openGauss)】 使用JDBC连接数据库
- “外行”带你看国标38900-2020(一)
- 用cdr怎么精确裁剪图形
- android开发经典实战!来自阿里巴巴佛系安卓程序员的指南,专题解析
- python编写函数输出自除数_728. 自除数(Python)
- 自行车平衡分析和控制-转载
- ipad照片文件删除了怎么恢复
- 基于51单片机的智能蓝牙路灯街灯控制系统proteus仿真原理图PCB
- 【云宏大讲坛】超融合,融合的不仅是基础架构
- 怎么选择一个好的企业即时通讯软件
- 网站app注册登录短信验证码是怎么获取实现的