1. 求java高手解答
String.Format 专用 类似于C#中{0}用法
 
%1$s表示第一个替换位置是以字符串类型放入
 
例如
 
System.out.println(String.format("%1$s 您好%2$s", "某某","!"));输出的是“某某 您好!”
 
String.format后第一个参数是表达式,后面可以放入N个待放入值
更详细用法参考下面:
 
import java.math.BigDecimal;
/**
 * 1.%[argument_index$][flags][width][.precision]conversion
 *  
 *   String.format("%1$s",1234,5678); 指向第一个参数转换为字符串
 *   String.format("%1$s%2$s",1234,5678);将两个参数格式化为字符串,并连接在一起
 *   String.format("%s",1234,5678);   指向第一个参数转换为字符串
 *   String.format("%s%06d",1234,5678); 将第一个格式化为“1234” 第二个格式化005678 w
 */
public class StringFormat {
 
/**
 * 处理浮点型数据 应用范围float、Float、double、Double 和 BigDecimal
 *  %[argument_index$][flags][width][.precision]conversion
 *   %[index$][标识][最小宽度][保留精度]转换方式
 *           标识:
 *                   '-'    在最小宽度内左对齐,不可以与“用0填充”同时使用
 *                        '+'    结果总是包括一个符号
 *                         '  '    正值前加空格,负值前加负号
 *                        '0'    结果将用零来填充
 *                        ','    每3位数字之间用“,”分隔(只适用于fgG的转换)
 *                         '('    若参数是负数,则结果中不添加负号而是用圆括号把数字括起来(只适用于eEfgG的转换)
 *                最小宽度: 最终该整数转化的字符串最少包含多少位数字
 *                保留精度:保留小数位后面个数
 *            转换方式:
 *                        'e', 'E'  --  结果被格式化为用计算机科学记数法表示的十进制数
 *                        'f'       --  结果被格式化为十进制普通表示方式
 *                        'g', 'G'  --  根据具体情况,自动选择用普通表示方式还是科学计数法方式
 *                        'a', 'A'  --  结果被格式化为带有效位数和指数的十六进制浮点数
 *                        
 */
public static void formatFloat() {
System.out.println(String.format("%1$e", 1234567890.123456789));//转换为科学记数法表示
System.out.println(String.format("%1$020e", 1234567890.123456789));//转换为科学记数法表示,长度为20,用0填充
System.out.println(String.format("%1$g", 12345.123456789));//根据结果制动识别使用转换器e或f
System.out.println(String.format("%1$a", 12345.123456789));//转换为16进制的浮点数
System.out.println(String.format("%1$,f", 1234567890.123456789));//转换结果保留默认小数位,3位数字用,隔开,转换为十进制表示
System.out.println(String.format("%1$,f", 1234567890.123456789));//转换结果保留默认小数位,3位数字用,隔开
System.out.println(String.format("%1$.10f", 1234567890.123456789));//转换结果是保留10位精度.转换成十进制表示方式
System.out.println(String.format("%1$,.100f", new BigDecimal("12345678909.1234567890123456789")));//转换结果是保留100位精度,没有精度丢失,整数位3个就用,隔开
System.out.println(String.format("%1$,.5f", 1234567890.123456789));//转换结果保留5位小数,3位数字用,隔开
}
/**
 * 处理整数型数据 应用范围 byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger 
 *                                         
 * %[argument_index$][flags][width]conversion
 *  %[index$][标识][最小宽度]转换方式
 *            标识:
 *                         '-'    在最小宽度内左对齐,不可以与“用0填充”同时使用
 *                        '#'   只适用于8进制和16进制,8进制时在结果前面增加一个0,16进制时在结果前面增加0x
 *                        '+'   结果总是包括一个符号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
 *                        '  '  正值前加空格,负值前加负号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
 *                        '0'   结果将用零来填充
 *                        ','   只适用于10进制,每3位数字之间用“,”分隔
 *                        '('   若参数是负数,则结果中不添加负号而是用圆括号把数字括起来(同‘+’具有同样的限制)
 *           最小宽度: 最终该整数转化的字符串最少包含多少位数字
 *           转换方式:d-十进制   o-八进制   x或X-十六进制 
 */
public static void formatNumber() {
System.out.println(String.format("%1$d", -31)); //格式化成数值表示使用十进制,结果"-31"
System.out.println(String.format("%1$o", -31)); //格式化成数值表示使用八进制,结果"37777777741"
System.out.println(String.format("%1$19d", -31));//格式化成数值表示使用十进制,总长度显示19位结果"                -31"
System.out.println(String.format("%1$-19d", -31));//格式化成数值表示使用十进制,总长度显示19位,左靠齐结果"-31                "
System.out.println(String.format("%1$09d", -31));//格式化成数值表示,使用十进制,结果"-00000031"
System.out.println(String.format("%1$,9d", -3123));//每3位数字用,隔开,总长度9位,结果"   -3,123"
System.out.println(String.format("%1$,09d", -3123));//每3位数字用,隔开,用0填充总长度9位,结果"-0003,123"
System.out.println(String.format("%1$(9d", -3123));//每3位数字用,用0填充总长度9位,结果"     (3123)"
System.out.println(String.format("%1$ 9d", -31));
}
/**
 * 处理字符型数据
 *         对字符进行格式化是非常简单的,c C表示字符,标识中'-'表示左对齐,其他就没什么了
 */
public static void formatChar() {
System.out.println(String.format("%1$c", 97));//转换为字符
System.out.println(String.format("%1$10c", '邹'));//转换为字符,十位
System.out.println(String.format("%1$-10c", '鸿'));//转换为字符,十位,靠左
}
/**
 * 格式化百分比.%特殊字符。转义格式为 %%而不是\
 */
public static void formatBaiFenBi() {
System.out.println(String.format("%1$f%%", 12.123456));
System.out.println(String.format("%1$.4f%%", 12.123456));//留取4位小数,4舍5入
BigDecimal a = new BigDecimal("12.12"),b = new BigDecimal("13.13");
BigDecimal c = a.divide(b,28,BigDecimal.ROUND_HALF_UP);//保留28位小数
System.out.println(c + "");
System.out.println(String.format("%1$.28f", c));//格式为保留28位小数
}
/**
 * 获取独立平台行分隔符
 */
public static void getSeparator() {
System.out.println(String.format("%n"));
System.out.println( System.getProperty("line.separator"));
}
/**
 * 格式化日期 (可用范围long,Long,Calendar,java.util.Date)
 * %[index$][标识][最小宽度]转换方式
 *          标识:
 *                 日期和时间转换字符的前缀 t或者T
 *          转换方式:
 *                 格式化日期转换字符
 *                         'B'  特定于语言环境的月份全称,例如 "January" 和 "February"。 
 *                        'b'  特定于语言环境的月份简称,例如 "Jan" 和 "Feb"。 
 *                        'h'  与 'b' 相同。 
 *                        'A'  特定于语言环境的星期几全称,例如 "Sunday" 和 "Monday" 
 *                        'a'  特定于语言环境的星期几简称,例如 "Sun" 和 "Mon" 
 *                        'C'  除以 100 的四位数表示的年份,被格式化为必要时带前导零的两位数,即 00 - 99 
 *                        'Y'  年份,被格式化为必要时带前导零的四位数(至少),例如,0092 等于格里高利历的 92 CE。 
 *                        'y'  年份的最后两位数,被格式化为必要时带前导零的两位数,即 00 - 99。 
 *                        'j'  一年中的天数,被格式化为必要时带前导零的三位数,例如,对于格里高利历是 001 - 366。 
 *                        'm'  月份,被格式化为必要时带前导零的两位数,即 01 - 13。 
 *                        'd'  一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31 
 *                        'e'  一个月中的天数,被格式化为两位数,即 1 - 31。 
 *
 *                 格式化时间字符
 *                         'H'  24 小时制的小时,被格式化为必要时带前导零的两位数,即 00 - 23。 
 *                        'I'  12 小时制的小时,被格式化为必要时带前导零的两位数,即 01 - 12。 
 *                        'k'  24 小时制的小时,即 0 - 23。 
 *                        'l'  12 小时制的小时,即 1 - 12。 
 *                        'M'  小时中的分钟,被格式化为必要时带前导零的两位数,即 00 - 59。 
 *                        'S'  分钟中的秒,被格式化为必要时带前导零的两位数,即 00 - 60 ("60" 是支持闰秒所需的一个特殊值)。 
 *                        'L'  秒中的毫秒,被格式化为必要时带前导零的三位数,即 000 - 999。 
 *                        'N'  秒中的毫微秒,被格式化为必要时带前导零的九位数,即 000000000 - 999999999。 
 *                        'p'  特定于语言环境的 上午或下午 标记以小写形式表示,例如 "am" 或 "pm"。使用转换前缀 'T' 可以强行将此输出转换为大写形式。 
 *                        'z'  相对于 GMT 的 RFC 822 格式的数字时区偏移量,例如 -0800。 
 *                        'Z'  表示时区缩写形式的字符串。Formatter 的语言环境将取代参数的语言环境(如果有)。 
 *                        's'  自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数,即 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 之间的差值。 
 *                        'Q'  自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数,即 Long.MIN_VALUE 与 Long.MAX_VALUE 之间的差值
 *                格式化时间组合字符
 *                        'R'  24 小时制的时间,被格式化为 "%tH:%tM" 
 *                        'T'  24 小时制的时间,被格式化为 "%tH:%tM:%tS"。 
 *                        'r'  12 小时制的时间,被格式化为 "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位置可能与语言环境有关。 
 *                        'D'  日期,被格式化为 "%tm/%td/%ty"。 
 *                        'F'  ISO 8601 格式的完整日期,被格式化为 "%tY-%tm-%td"。 
 *                        'c'  日期和时间,被格式化为 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。 
 *
 */
public static void formatDate() {
long c = System.currentTimeMillis();
System.out.println(String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", c));
System.out.println(String.format("%1$ty-%1$tm-%1$td %1$tI:%1$tM:%1$tS %1$tp %1$tb %1$ta", c));
System.out.println(String.format("%1$tF %1$tT", 1244943575031l));
}
/**
 * 规转换可应用于任何参数类型
 *                 'b或B'  '\u0062'  将生成 "true" 或 "false", 如果参数为 null,则结果为 "false"。如果参数是一个 boolean 值或 Boolean,那么结果是由 String.valueOf() 返回的字符串。否则结果为 "true"。
 *                'h或H'  '\u0068'  生成一个表示对象的哈希码值的字符串。  如果参数 arg 为 null,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。
 *                's或S'  '\u0073'  生成一个字符串。 如果参数为 null,则结果为 "null"。如果参数实现了 Formattable,则调用其 formatTo 方法。否则,结果为调用参数的 toString() 方法得到的结果。 
 *
 *
 */
public static void formatAny() {
System.out.println(String.format("%b %b %b %b", null,"","true",true));
String pattern = "%1$s 在 %4$tF %4$tT 说了 \"%1$s 爱 %2$s %3$d 年\"";
System.out.println(String.format(pattern, "mingming","shuilian",10000,System.currentTimeMillis()));
}
public static void main(String[] args) {
formatAny();
}
}
2. java中使用日志主要分为哪几个步骤
首先,在项目中的classes 中新建立一个log4j.properties文件即可;
 
在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是java properties(key=value)【Java特性文件(键=值)】。(这里只说明properties文件) 
 1、配置根Logger 
 
 其语法为:
 log4j.rootLogger = [ level ] , appenderName1, appenderName2, … 
 level : 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
 例如:log4j.rootLogger=info,A1,B2,C3 
 2、配置日志信息输出目的地
 
 其语法为:
 log4j.appender.appenderName = fully.qualified.name.of.appender.class // 
 "fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个:
 
 1.org.apache.log4j.ConsoleAppender(控制台)
 2.org.apache.log4j.FileAppender(文件)
 3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
 4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
 5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
 
 1.ConsoleAppender选项
 Threshold=WARN:指定日志消息的输出最低层次。
 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
 Target=System.err:默认情况下是:System.out,指定输出控制台
 2.FileAppender 选项
 Threshold=WARN:指定日志消息的输出最低层次。
 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
 File=mylog.txt:指定消息输出到mylog.txt文件。
 Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
 3.DailyRollingFileAppender 选项
 Threshold=WARN:指定日志消息的输出最低层次。
 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
 File=mylog.txt:指定消息输出到mylog.txt文件。
 Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
 DatePattern=''.''yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
 1)''.''yyyy-MM: 每月
 2)''.''yyyy-ww: 每周 
 3)''.''yyyy-MM-dd: 每天
 4)''.''yyyy-MM-dd-a: 每天两次
 5)''.''yyyy-MM-dd-HH: 每小时
 6)''.''yyyy-MM-dd-HH-mm: 每分钟
 4.RollingFileAppender 选项
 Threshold=WARN:指定日志消息的输出最低层次。
 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
 File=mylog.txt:指定消息输出到mylog.txt文件。
 Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
 MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
 MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
 3、配置日志信息的格式
 
 其语法为:
 1). log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
 "fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个:
 1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
 2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
 3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
 4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
 1.HTMLLayout 选项
 LocationInfo=true:默认值是false,输出java文件名称和行号
 Title=my app file: 默认值是 Log4J Log Messages. 
 2.PatternLayout 选项
 ConversionPattern=%m%n :指定怎样格式化指定的消息。
 3.XMLLayout 选项
 LocationInfo=true:默认值是false,输出java文件和行号
 2). log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n 
 这里需要说明的就是日志信息格式中几个符号所代表的含义:
 -X号: X信息输出时左对齐;
 %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, 
 %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 
 %r: 输出自应用启动到输出该log信息耗费的毫秒数
 %c: 输出日志信息所属的类目,通常就是所在类的全名
 %t: 输出产生该日志事件的线程名
 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) 
 %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
 %%: 输出一个"%"字符
 %F: 输出日志消息产生时所在的文件名称
 %L: 输出代码中的行号
 %m: 输出代码中指定的消息,产生的日志具体信息
 %n: 输出一个回车换行符,Windows平台为" 
",Unix平台为"
"输出日志信息换行
 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
 1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
 2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
 3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
 4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉
比较详细的例子
log4j.rootLogger=INFO,consoleAppender,logfile,MAIL
log4j.addivity.org.apache=true
 
#ConsoleAppender,控制台输出
#FileAppender,文件日志输出
#SMTPAppender,发邮件输出日志
#SocketAppender,Socket日志
#NTEventLogAppender,Window NT日志
#SyslogAppender,
#JMSAppender,
#AsyncAppender,
#NullAppender
 
#文件输出:RollingFileAppender
#log4j.rootLogger = INFO,logfile
log4j.appender.logfile = org.apache.log4j.RollingFileAppender
log4j.appender.logfile.Threshold = INFO 
# 输出以上的INFO信息
log4j.appender.logfile.File = INFO_log.html 
#保存log文件路径
log4j.appender.logfile.Append = true 
# 默认为true,添加到末尾,false在每次启动时进行覆盖
log4j.appender.logfile.MaxFileSize = 1MB 
# 一个log文件的大小,超过这个大小就又会生成1个日志 # KB ,MB,GB 
log4j.appender.logfile.MaxBackupIndex = 3 
# 最多保存3个文件备份
log4j.appender.logfile.layout = org.apache.log4j.HTMLLayout 
# 输出文件的格式
log4j.appender.logfile.layout.LocationInfo = true 
#是否显示类名和行数
log4j.appender.logfile.layout.Title =title:\u63d0\u9192\u60a8\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8bef 
#html页面的 < title > 
############################## SampleLayout ####################################
# log4j.appender.logfile.layout = org.apache.log4j.SampleLayout
############################## PatternLayout ###################################
# log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
# log4j.appender.logfile.layout.ConversionPattern =% d % p [ % c] - % m % n % d
############################## XMLLayout #######################################
# log4j.appender.logfile.layout = org.apache.log4j.XMLLayout
# log4j.appender.logfile.layout.LocationInfo = true #是否显示类名和行数
############################## TTCCLayout ######################################
# log4j.appender.logfile.layout = org.apache.log4j.TTCCLayout
# log4j.appender.logfile.layout.DateFormat = ISO8601
#NULL, RELATIVE, ABSOLUTE, DATE or ISO8601.
# log4j.appender.logfile.layout.TimeZoneID = GMT - 8 : 00 
# log4j.appender.logfile.layout.CategoryPrefixing = false ##默认为true 打印类别名
# log4j.appender.logfile.layout.ContextPrinting = false ##默认为true 打印上下文信息
# log4j.appender.logfile.layout.ThreadPrinting = false ##默认为true 打印线程名
# 打印信息如下:
#2007 - 09 - 13 14 : 45 : 39 , 765 [http - 8080 - 1 ] ERROR com.poxool.test.test - error成功关闭链接
###############################################################################
#每天文件的输出:DailyRollingFileAppender
#log4j.rootLogger = INFO,errorlogfile
log4j.appender.errorlogfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlogfile.Threshold = ERROR
log4j.appender.errorlogfile.File = ../logs/ERROR_log
log4j.appender.errorlogfile.Append = true 
#默认为true,添加到末尾,false在每次启动时进行覆盖
log4j.appender.errorlogfile.ImmediateFlush = true 
#直接输出,不进行缓存
# ' . ' yyyy - MM: 每个月更新一个log日志
# ' . ' yyyy - ww: 每个星期更新一个log日志
# ' . ' yyyy - MM - dd: 每天更新一个log日志
# ' . ' yyyy - MM - dd - a: 每天的午夜和正午更新一个log日志
# ' . ' yyyy - MM - dd - HH: 每小时更新一个log日志
# ' . ' yyyy - MM - dd - HH - mm: 每分钟更新一个log日志
log4j.appender.errorlogfile.DatePattern = ' . ' yyyy - MM - dd ' .log ' 
#文件名称的格式
log4j.appender.errorlogfile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlogfile.layout.ConversionPattern =%d %p [ %c] - %m %n %d
 
#控制台输出:
#log4j.rootLogger = INFO,consoleAppender
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold = ERROR
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern =%d %-5p %m %n
log4j.appender.consoleAppender.ImmediateFlush = true
 
# 直接输出,不进行缓存
log4j.appender.consoleAppender.Target = System.err 
# 默认是System.out方式输出
 
#发送邮件:SMTPAppender
#log4j.rootLogger = INFO,MAIL
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold = INFO
log4j.appender.MAIL.BufferSize = 10
log4j.appender.MAIL.From = [email protected]
log4j.appender.MAIL.SMTPHost = smtp.gmail.com
log4j.appender.MAIL.Subject = Log4J Message
log4j.appender.MAIL.To = [email protected]
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern =%d - %c -%-4r [%t] %-5p %c %x - %m %n
 
#数据库:JDBCAppender
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@ 210.51 . 173.94 : 1521 :YDB
log4j.appender.DATABASE.driver = oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user = ydbuser
log4j.appender.DATABASE.password = ydbuser
log4j.appender.DATABASE.sql = INSERT INTO A1 (TITLE3) VALUES ( ' %d - %c %-5p %c %x - %m%n ' )
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern =% d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
#数据库的链接会有问题,可以重写org.apache.log4j.jdbc.JDBCAppender的getConnection() 使用数据库链接池去得链接,可以避免insert一条就链接一次数据库
3. 有人知道怎么把ISO8601标准的时间转化成Java对象吗
般情况直接用replace("2011-9-9","-","/")行,
涉及数据转换用两:
CStr(变量) 其类型转字符串型
CDate(变量) 其类型转期型
:原变量date1期型,
date1=date
obj=replace(cstr(date1),"-","/")
obj要格式.
另外借用自定义函数转换.
Function FormatDate(sDateTime, sReallyDo)
Dim sJorkin
sJorkin = GetLocale()
If Not IsDate(sDateTime) Then sDateTime = Now()
sDateTime = CDate(sDateTime)
Select Case UCase(sReallyDo & "")
Case "0", "1", "2", "3", "4"
FormatDate = FormatDateTime(sDateTime, sReallyDo)
Case "00"
FormatDate = FormatDate(sDateTime, "YYYY-MM-DD hh:mm:ss")
Case "01"
FormatDate = FormatDate(sDateTime, "YYYYMM月DD")
Case "02"
FormatDate = FormatDate(sDateTime, "YYYY-MM-DD")
Case "03"
FormatDate = FormatDate(sDateTime, "hh:mm:ss")
Case "04"
FormatDate = FormatDate(sDateTime, "hh:mm")
Case "ISO8601", "GOOGLE", "SITEMAP" '//ISO8601格式, 般用于GoogleSiteMap, "+08:00" 区.
FormatDate = FormatDate(sDateTime, "YYYY-MM-DDThh:mm:ss.000+08:00")
Case "RFC822", "RSS", "FEED" '//RFC822格式, 般用于RSS, "+0800" 区.
SetLocale("en-gb")
FormatDate = FormatDate(sDateTime, "ew, DD eMM YYYY hh:mm:ss +0800")
SetLocale(sJorkin)
Case "RND", "RAND", "RANDOMIZE" '//随机字符串
Randomize
sJorkin = Rnd()
FormatDate = FormatDate(sDateTime, "YYYYMMDDhhmmss") & _
Fix((9 * 10^6 -1) * sJorkin) + 10^6
Case Else
FormatDate = sReallyDo
FormatDate = Replace(FormatDate, "YYYY", Year(sDateTime))
FormatDate = Replace(FormatDate, "DD", Right("0" & Day(sDateTime), 2))
FormatDate = Replace(FormatDate, "hh", Right("0" & Hour(sDateTime), 2))
FormatDate = Replace(FormatDate, "mm", Right("0" & Minute(sDateTime), 2))
FormatDate = Replace(FormatDate, "ss", Right("0" & Second(sDateTime), 2))
FormatDate = Replace(FormatDate, "YY", Right(Year(sDateTime), 2))
FormatDate = Replace(FormatDate, "D", Day(sDateTime))
FormatDate = Replace(FormatDate, "h", Hour(sDateTime))
FormatDate = Replace(FormatDate, "m", Minute(sDateTime))
FormatDate = Replace(FormatDate, "s", Second(sDateTime))
If InStr(1, FormatDate, "EW", 1) > 0 Then
SetLocale("en-gb")
FormatDate = Replace(FormatDate, "EW", UCase(WeekdayName(Weekday(sDateTime), False)))
FormatDate = Replace(FormatDate, "eW", WeekdayName(Weekday(sDateTime), False))
FormatDate = Replace(FormatDate, "Ew", UCase(WeekdayName(Weekday(sDateTime), True)))
FormatDate = Replace(FormatDate, "ew", WeekdayName(Weekday(sDateTime), True))
SetLocale(sJorkin)
Else
FormatDate = Replace(FormatDate, "W", WeekdayName(Weekday(sDateTime), False))
FormatDate = Replace(FormatDate, "w", WeekdayName(Weekday(sDateTime), True))
End If
If InStr(1, FormatDate, "EMM", 1) > 0 Then
SetLocale("en-gb")
FormatDate = Replace(FormatDate, "EMM", MonthName(Month(sDateTime), False))
FormatDate = Replace(FormatDate, "eMM", MonthName(Month(sDateTime), True))
SetLocale(sJorkin)
Else
FormatDate = Replace(FormatDate, "MM", Right("0" & Month(sDateTime), 2))
FormatDate = Replace(FormatDate, "M", Month(sDateTime))
End If
End Select
End Function
%>
'期格式化ISO8601格式
Response.Write(FormatDate("2008-03-06 08:03:06", "SITEMAP"))
'期格式化RFC822格式
Response.Write(FormatDate("2008-03-06 08:03:06", "RSS"))
'期格式化(英星期, 英月//)
Response.Write(FormatDate(Now(), "eW, EMM/DD/YYYY"))
'月秒随机数字符串
Response.Write(FormatDate(Now(), "RND"))
般情况直接用replace("2011-9-9","-","/")行,
涉及数据转换用两:
CStr(变量) 其类型转字符串型
CDate(变量) 其类型转期型
:原变量date1期型,
date1=date
obj=replace(cstr(date1),"-","/")
obj要格式.
另外借用自定义函数转换.
Function FormatDate(sDateTime, sReallyDo)
Dim sJorkin
sJorkin = GetLocale()
If Not IsDate(sDateTime) Then sDateTime = Now()
sDateTime = CDate(sDateTime)
Select Case UCase(sReallyDo & "")
Case "0", "1", "2", "3", "4"
FormatDate = FormatDateTime(sDateTime, sReallyDo)
Case "00"
FormatDate = FormatDate(sDateTime, "YYYY-MM-DD hh:mm:ss")
Case "01"
FormatDate = FormatDate(sDateTime, "YYYYMM月DD")
Case "02"
FormatDate = FormatDate(sDateTime, "YYYY-MM-DD")
Case "03"
FormatDate = FormatDate(sDateTime, "hh:mm:ss")
Case "04"
FormatDate = FormatDate(sDateTime, "hh:mm")
Case "ISO8601", "GOOGLE", "SITEMAP" '//ISO8601格式, 般用于GoogleSiteMap, "+08:00" 区.
FormatDate = FormatDate(sDateTime, "YYYY-MM-DDThh:mm:ss.000+08:00")
Case "RFC822", "RSS", "FEED" '//RFC822格式, 般用于RSS, "+0800" 区.
SetLocale("en-gb")
FormatDate = FormatDate(sDateTime, "ew, DD eMM YYYY hh:mm:ss +0800")
SetLocale(sJorkin)
Case "RND", "RAND", "RANDOMIZE" '//随机字符串
Randomize
sJorkin = Rnd()
FormatDate = FormatDate(sDateTime, "YYYYMMDDhhmmss") & _
Fix((9 * 10^6 -1) * sJorkin) + 10^6
Case Else
FormatDate = sReallyDo
FormatDate = Replace(FormatDate, "YYYY", Year(sDateTime))
FormatDate = Replace(FormatDate, "DD", Right("0" & Day(sDateTime), 2))
FormatDate = Replace(FormatDate, "hh", Right("0" & Hour(sDateTime), 2))
FormatDate = Replace(FormatDate, "mm", Right("0" & Minute(sDateTime), 2))
FormatDate = Replace(FormatDate, "ss", Right("0" & Second(sDateTime), 2))
FormatDate = Replace(FormatDate, "YY", Right(Year(sDateTime), 2))
FormatDate = Replace(FormatDate, "D", Day(sDateTime))
FormatDate = Replace(FormatDate, "h", Hour(sDateTime))
FormatDate = Replace(FormatDate, "m", Minute(sDateTime))
FormatDate = Replace(FormatDate, "s", Second(sDateTime))
If InStr(1, FormatDate, "EW", 1) > 0 Then
SetLocale("en-gb")
FormatDate = Replace(FormatDate, "EW", UCase(WeekdayName(Weekday(sDateTime), False)))
FormatDate = Replace(FormatDate, "eW", WeekdayName(Weekday(sDateTime), False))
FormatDate = Replace(FormatDate, "Ew", UCase(WeekdayName(Weekday(sDateTime), True)))
FormatDate = Replace(FormatDate, "ew", WeekdayName(Weekday(sDateTime), True))
SetLocale(sJorkin)
Else
FormatDate = Replace(FormatDate, "W", WeekdayName(Weekday(sDateTime), False))
FormatDate = Replace(FormatDate, "w", WeekdayName(Weekday(sDateTime), True))
End If
If InStr(1, FormatDate, "EMM", 1) > 0 Then
SetLocale("en-gb")
FormatDate = Replace(FormatDate, "EMM", MonthName(Month(sDateTime), False))
FormatDate = Replace(FormatDate, "eMM", MonthName(Month(sDateTime), True))
SetLocale(sJorkin)
Else
FormatDate = Replace(FormatDate, "MM", Right("0" & Month(sDateTime), 2))
FormatDate = Replace(FormatDate, "M", Month(sDateTime))
End If
End Select
End Function
%>
'期格式化ISO8601格式
Response.Write(FormatDate("2008-03-06 08:03:06", "SITEMAP"))
'期格式化RFC822格式
Response.Write(FormatDate("2008-03-06 08:03:06", "RSS"))
'期格式化(英星期, 英月//)
Response.Write(FormatDate(Now(), "eW, EMM/DD/YYYY"))
'月秒随机数字符串
Response.Write(FormatDate(Now(), "RND"))
4. iOS-时间格式ISO 8601
服务器返回来的时间字符串格式是这种:“2017-09-30T09:00:00”,比一般时间字符串中间多了个字母“T”,网上搜了一下这种时间字符串格式是ISO 8601标准。
  
 处理方式:
  
 NSISO8601DateFormatter
   该类(NSISO8601DateFormatter)是在iOS 10才出现的,该类完美的处理了时间问题,即使你的APP涉及国外用户,只要你们开发团队在时间格式上都遵守ISO8601格式,那么你就再也不用担心时间出错了。当然,你们也可以使用时间戳。
  
 附加:日期相关格式
   字符说明
   (:)
   时间分隔符。在某些区域设置中,可以使用其他字符表示时间分隔符。时间分隔符在格式化时间值时分隔小时、分钟和秒。格式化输出中用作时间分隔符的实际字符由您的应用程序的当前区域性值确定。
   (/)
   日期分隔符。在某些区域设置中,可以使用其他字符表示日期分隔符。日期分隔符在格式化日期值时分隔日、月和年。格式化输出中用作日期分隔符的实际字符由您的应用程序的当前区域性确定。
   (%)
   用于表明不论尾随什么字母,随后字符都应该以单字母格式读取。也用于表明单字母格式应以用户定义格式读取。有关更多详细信息,请参见下面的内容。
   d
   将日显示为不带前导零的数字(如 1)。如果这是用户定义的数字格式中的唯一字符,请使用 %d。
   dd
   将日显示为带前导零的数字(如 01)。
   EEE
   将日显示为缩写形式(例如 Sun)。
   EEEE
   将日显示为全名(例如 Sunday)。
   M
   将月份显示为不带前导零的数字(如一月表示为 1)。如果这是用户定义的数字格式中的唯一字符,请使用 %M。
   MM
   将月份显示为带前导零的数字(例如 01/12/01)。
   MMM
   将月份显示为缩写形式(例如 Jan)。
   MMMM
   将月份显示为完整月份名(例如 January)。
   gg
   显示时代/纪元字符串(例如 A.D.)
   h
   使用 12 小时制将小时显示为不带前导零的数字(例如 1:15:15 PM)。如果这是用户定义的数字格式中的唯一字符,请使用 %h。
   hh
   使用 12 小时制将小时显示为带前导零的数字(例如 01:15:15 PM)。
   H
   使用 24 小时制将小时显示为不带前导零的数字(例如 1:15:15)。如果这是用户定义的数字格式中的唯一字符,请使用 %H。
   HH
   使用 24 小时制将小时显示为带前导零的数字(例如 01:15:15)。
   m
   将分钟显示为不带前导零的数字(例如 12:1:15)。如果这是用户定义的数字格式中的唯一字符,请使用 %m。
   mm
   将分钟显示为带前导零的数字(例如 12:01:15)。
   s
   将秒显示为不带前导零的数字(例如 12:15:5)。如果这是用户定义的数字格式中的唯一字符,请使用 %s。
   ss
   将秒显示为带前导零的数字(例如 12:15:05)。
   f
   显示秒的小数部分。例如,ff 将精确显示到百分之一秒,而 ffff 将精确显示到万分之一秒。用户定义格式中最多可使用七个 f 符号。如果这是用户定义的数字格式中的唯一字符,请使用 %f。
   t
   使用 12 小时制,并对中午之前的任一小时显示大写的 A,对中午到 11:59 P.M 之间的任一小时显示大写的 P。如果这是用户定义的数字格式中的唯一字符,请使用 %t。
   tt
   对于使用 12 小时制的区域设置,对中午之前任一小时显示大写的 AM,对中午到 11:59 P.M 之间的任一小时显示大写的 PM。
   对于使用 24 小时制的区域设置,不显示任何字符。
   y
   将年份 (0-9) 显示为不带前导零的数字。如果这是用户定义的数字格式中的唯一字符,请使用 %y。
   yy
   以带前导零的两位数字格式显示年份(如果适用)。
   yyy
   以四位数字格式显示年份。
   yyyy
   以四位数字格式显示年份。
   z
   显示不带前导零的时区偏移量(如 -8)。如果这是用户定义的数字格式中的唯一字符,请使用 %z。
   zz
   显示带前导零的时区偏移量(例如 -08)
   zzz
   显示完整的时区偏移量(例如 -08:00)
   格式显示:
   M/d/yy
   12/7/58
   d-MMM
   7-Dec
   d-MMMM-yy
   7-December-58
   d MMMM
   7 December
   MMMM yy
   December 58
   hh:mm tt
   08:50 PM
   h:mm:ss t
   8:50:35 P
   H:mm
   20:50
   H:mm:ss
   20:50:35
   M/d/yyyy H:mm
   12/7/1958 20:50
5. 程序包java.time不存在怎么解决
jdk版本太低,java.time.LocalTime是java 8新出的包。如果版本太低的话,比如jdk1.6,当然java.time不存在。换一个好版本的jdk!!
为什么需要新的日期/日期API?
在开始研究Java 8日期/时间API之前,让我们先来看一下为什么我们需要这样一个新的API。在Java中,现有的与日期和时间相关的类存在诸多问题,其中有:
Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。
java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
对于时间、时间戳、格式化以及解析,并没有一些明确定义的类。对于格式化和解析的需求,我们有java.text.DateFormat抽象类,但通常情况下,SimpleDateFormat类被用于此类需求。
所有的日期类都是可变的,因此他们都不是线程安全的,这是Java日期类最大的问题之一。
日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
在现有的日期和日历类中定义的方法还存在一些其他的问题,但以上问题已经很清晰地表明:Java需要一个健壮的日期/时间类。这也是为什么Joda Time在Java日期/时间需求中扮演了高质量替换的重要角色。
Java 8日期/时间API
Java 8日期/时间API是JSR-310的实现,它的实现目标是克服旧的日期时间实现中所有的缺陷,新的日期/时间API的一些设计原则是:
不变性:新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处。
关注点分离:新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类。
清晰:在所有的类中,方法都被明确定义用以完成相同的行为。举个例子,要拿到当前实例我们可以使用now()方法,在所有的类中都定义了format()和parse()方法,而不是像以前那样专门有一个独立的类。为了更好的处理问题,所有的类都使用了工厂模式和策略模式,一旦你使用了其中某个类的方法,与其他类协同工作并不困难。
实用操作:所有新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等。
可扩展性:新的日期/时间API是工作在ISO-8601日历系统上的,但我们也可以将其应用在非IOS的日历上。
Java 8 日期/时间API包:
java.time包:这是新的Java日期/时间API的基础包,所有的主要基础类都是这个包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。所有这些类都是不可变的和线程安全的,在绝大多数情况下,这些类能够有效地处理一些公共的需求。
java.time.chrono包:这个包为非ISO的日历系统定义了一些泛化的API,我们可以扩展AbstractChronology类来创建自己的日历系统。
java.time.format包:这个包包含能够格式化和解析日期时间对象的类,在绝大多数情况下,我们不应该直接使用它们,因为java.time包中相应的类已经提供了格式化和解析的方法。
java.time.temporal包:这个包包含一些时态对象,我们可以用其找出关于日期/时间对象的某个特定日期或时间,比如说,可以找到某月的第一天或最后一天。你可以非常容易地认出这些方法,因为它们都具有“withXXX”的格式。
java.time.zone包:这个包包含支持不同时区以及相关规则的类。