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包:這個包包含支持不同時區以及相關規則的類。