第 18章
舍遗补缺
– 日期、时间
– 日志( Logging)
– 讯息绑定使用 Date
取得系统的时间,可以使用
System.currentTimeMillis()方法
从 1970年 1月 1日 0时 0分 0秒开始,到程序执行取得系统时间为止所经过的毫秒数
public class CurrentTime {
public static void main(String[] args) {
System.out.println("现在时间 "
+ System.currentTimeMillis());
}
}
使用 Date
Date date = new Date();
System.out.println("现在时间 "
+ date.toString());
System.out.println("自 1970/1/1至今的毫秒数 "
+ date.getTime());
现在时间 Mon Jun 06 22:03:52 GMT+08:00 2005
自 1970/1/1至今的毫秒数 1118066632890
使用 Date
对日期时间作格式设定,则可以使用
java.text.DateFormat来作格式化
Date date = new Date();
DateFormat dateFormat =
new SimpleDateFormat("EE-MM-dd-yyyy");
System.out.println(dateFormat.format(date));
星期一 -06-06-2005
使用 Date
直接使用 DateFormat上的静态
getDateTimeInstance()方法来指定格式
Date date = new Date();
//简短信息格式
DateFormat shortFormat =
DateFormat.getDateTimeInstance(
DateFormat.SHORT,DateFormat.SHORT);
//中等信息格式
DateFormat mediumFormat =
DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,DateFormat.MEDIUM);
//长信息格式
DateFormat longFormat =
DateFormat.getDateTimeInstance(
DateFormat.LONG,DateFormat.LONG);
使用 Date
//详细信息格式
DateFormat fullFormat =
DateFormat.getDateTimeInstance(
DateFormat.FULL,DateFormat.FULL);
System.out.println("简短信息格式," +
shortFormat.format(date));
System.out.println("中等信息格式," +
mediumFormat.format(date));
System.out.println("长信息格式," +
longFormat.format(date));
System.out.println("详细信息格式," +
fullFormat.format(date));
简短信息格式,2005/6/6下午 10:19
中等信息格式,2005/6/6下午 10:19:13
长信息格式,2005年 6月 6日 下午 10时 19分 13秒详细信息格式,2005年 6月 6日 星期一 下午 10时 19分 13秒 GMT+08:00
使用 Date
指定日期的区域显示方式,指定时要使用一个 java.util.Locale实例作为自变量
//取得目前时间
Date date = new Date();
// en:英语系 US:美国
Locale locale = new Locale("en","US");
//简短信息格式
DateFormat shortFormat =
DateFormat.getDateTimeInstance(
DateFormat.SHORT,DateFormat.SHORT,locale);
使用 Calendar
Calendar的一些方法会取回 int型态数字
取回的数字对应于 Calendar中定义的常数
传回的 4并不是代表目前时间是 4月份,而是对应于 Calendar.MAY常数的值
Calendar rightNow = Calendar.getInstance();
System.out.println(rightNow.get(Calendar.YEAR));
System.out.println(rightNow.get(Calendar.MONTH));
使用 Calendar
显示传回值的真正意涵
String[] months = {"一月 ","二月 ","三月 ","四月 ",
"五月 ","六月 ","七月 ","八月 ",
"九月 ","十月 ","十一月 ","十二月 "};
Calendar rightNow = Calendar.getInstance();
int monthConstant = rightNow.get(Calendar.MONTH);
System.out.println(months[monthConstant]);
使用 Calendar
显示传回值的真正意涵
String[] dayOfWeek = {"","日 ","一 ","二 ",
"三 ","四 ","五 ","六 "};
Calendar rightNow = Calendar.getInstance();
int dayOfWeekConstant = rightNow.get(Calendar.DAY_OF_WEEK);
System.out.println(dayOfWeek[dayOfWeekConstant]);
简介日志
在 Java SE中的 java.util.logging套件提供了一系列的日志工具类别
首先要取得 java.util.logging.Logger实例
Logger logger = Logger.getLogger("LoggingDemo");
try {
System.out.println(args[0]);
}
catch(ArrayIndexOutOfBoundsException e) {
logger.warning("没有提供执行时的自变量! ");
}
日志的等级
在进行讯息的日志记录时,依讯息程度的不同,您会设定不同等级的讯息输出
Logger logger = Logger.getLogger("loggingLevelDemo");
logger.severe("严重讯息 ");
logger.warning("警示讯息 ");
logger.info("一般讯息 ");
logger.config("设定方面的讯息 ");
logger.fine("细微的讯息 ");
logger.finer("更细微的讯息 ");
logger.finest("最细微的讯息 ");
日志的等级
Logger的默认等级是 INFO
默认等级是定义在执行环境的属性文件
logging.properties中
JRE安装目录的 lib目录下
Logger预设的处理者( Handler)是
java.util.logging.ConsolerHandler
日志的等级
Logger logger = Logger.getLogger("loggingLevelDemo2");
//显示所有等级的讯息
logger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
//显示所有等级的讯息
consoleHandler.setLevel(Level.ALL);
//设定处理者为 ConsoleHandler
logger.addHandler(consoleHandler);
logger.severe("严重讯息 ");
logger.warning("警示讯息 ");
logger.info("一般讯息 ");
logger.config("设定方面的讯息 ");
logger.fine("细微的讯息 ");
logger.finer("更细微的讯息 ");
logger.finest("最细微的讯息 ");
日志的等级
想要关闭所有的讯息,可以设定 為
Level.OFF
Logger的 server(),warning(),info()等方法,实际上是个便捷的方法
可以直接使用 log()方法并指定等级来执行相同的作用日志的等级
Logger logger = Logger.getLogger("loggingLevelDemo3");
logger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
logger.addHandler(consoleHandler);
logger.log(Level.SEVERE,"严重讯息 ");
logger.log(Level.WARNING,"警示讯息 ");
logger.log(Level.INFO,"一般讯息 ");
logger.log(Level.CONFIG,"设定方面的讯息 ");
logger.log(Level.FINE,"细微的讯息 ");
logger.log(Level.FINER,"更细微的讯息 ");
logger.log(Level.FINEST,"最细微的讯息 ");
Handler,Formatter
Logger预设的输出处理者( Handler)是
ConsolerHandler
ConsolerHandler的输出是 System.err物件
讯息的默认等级是 INFO
可以在 JRE安装目录下 lib目录的
logging.properties中看到
handlers= java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = INFO
Handler,Formatter
Java SE提供了五个预设的 Handler
– java.util.logging.ConsoleHandler
– java.util.logging.FileHandler
– java.util.logging.StreamHandler
– java.util.logging.SocketHandler
– java.util.logging.MemoryHandler
Handler,Formatter
Logger logger = Logger.getLogger("handlerDemo");
try {
FileHandler fileHandler =
new FileHandler("%h/myLogger.log");
logger.addHandler(fileHandler);
logger.info("测试讯息 ");
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
自定义 Formatter
继承抽象类 Formatter,并重新定义其
format()方法
public class TableFormatter extends Formatter {
public String format(LogRecord logRecord) {
return
"LogRecord info," +
logRecord.getSourceClassName() + "\n" +
"Level\t|\tLoggerName\t|\tMessage\t|\n" +
logRecord.getLevel() + "\t|\t" +
logRecord.getLoggerName() + "\t|\t" +
logRecord.getMessage() + "\t|\n\n";
}
}
自定义 Formatter
Logger logger = Logger.getLogger("tableFormatter");
try {
for(Handler h,logger.getParent().getHandlers()) {
if(h instanceof ConsoleHandler) {
h.setFormatter(new TableFormatter());
}
}
logger.info("讯息 1");
logger.warning("讯息 2");
} catch (SecurityException e) {
e.printStackTrace();
}
Logger阶层关系
给 getLogger()方法的名称是有意义的
给定,onlyfun”,实际上您将从根( Root)
logger继承一些特性
再取得一个 Logger实例,并给定名称
"onlyfun.caterpillar",则这次取得的 Logger
将继承 "onlyfun"这个 Logger的特性使用 ResourceBundle
用 java.util.ResourceBundle来作讯息绑定
messages.properties
,properties档案必须放置在 Classpath的路径设定下
onlyfun.caterpillar.welcome=Hello
onlyfun.caterpillar.name=World
使用 ResourceBundle
//绑定 messages.properties
ResourceBundle resource =
ResourceBundle.getBundle("messages");
//取得对应讯息
System.out.print(resource.getString(
"onlyfun.caterpillar.welcome") + "!");
System.out.println(resource.getString(
"onlyfun.caterpillar.name") + "!");
格式化讯息
String message = "Hello! {0}! This is your first {1}!";
Object[] params =
new Object[] {"caterpillar","Java"};
MessageFormat formatter =
new MessageFormat(message);
//显示格式化后的讯息
System.out.println(formatter.format(params));
格式化讯息
onlyfun.caterpillar.greeting=Hello! {0}! This is your first {1}!
//绑定 messages.properties
ResourceBundle resource =
ResourceBundle.getBundle("messages2");
String message = resource.getString(
"onlyfun.caterpillar.greeting");
Object[] params =
new Object[] {args[0],args[1]};
MessageFormat formatter =
new MessageFormat(message);
//显示格式化后的讯息
System.out.println(formatter.format(params));
国际化讯息
Internationalization,I18N
– basename.properties(预设 )
– basename_en.properties
– basename_zh_TW.properties
Locale locale = new Locale("zh","TW");
国际化讯息
onlyfun.caterpillar.welcome=哈啰
onlyfun.caterpillar.name=世界
native2ascii -encoding Big5 messages3_zh_TW.txt
messages3_zh_TW.properties
onlyfun.caterpillar.welcome=\u54c8\u56c9
onlyfun.caterpillar.name=\u4e16\u754c
国际化讯息
想提供 messages_en_US.properties档案,
并想要 ResourceBundle.getBundle()取得这个档案的内容
Locale locale = new Locale("en","US");
ResourceBundle resource =
ResourceBundle.getBundle("messages",locale);