求教日期格式化的问题

踏雪耗子 2011-07-18 10:16:37
现在给你一个时间串比如:“20380706”或“203876”我想格式化为“2038-07-06”
在使用SimpleDateFormat格式化的时候,会获取当前手机设置的时区,那么这样就会出现一个问题
当手机设置为不同时区的时候就会出现格式化后的日期为“2038-07-05”或“2038-07-06”或“2038-07-07”
现在我想的就是利用String的分割和拼接自己实现格式化,或者指定SimpleDateFormat格式化的时区为0时区,但是不知道0时区的设置值是多少;
大家有什么好的方案推荐下~~~
...全文
974 45 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
leshor 2011-07-21
  • 打赏
  • 举报
回复
如果服务器给的是String,格式固定的话,就拼接吧!

还有个疑问:服务器的时区不是确定的吗?如果不确定的话,用SimpleDateFormat就比较悬了。
踏雪耗子 2011-07-20
  • 打赏
  • 举报
回复
使用SimpleDateFormat就会跟时区扯上关系~~~


[Quote=引用 43 楼 qingmingcom 的回复:]
跟时区没一毛钱关系,是时间的解析和格式化。18楼很完美了。


引用 18 楼 shine333 的回复:

服务器给你的是20380706,你就直接
Java code
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
Date date = sdf1.parse("20380706");
SimpleDateF……
[/Quote]
qingmingcom 2011-07-20
  • 打赏
  • 举报
回复
跟时区没一毛钱关系,是时间的解析和格式化。18楼很完美了。

[Quote=引用 18 楼 shine333 的回复:]

服务器给你的是20380706,你就直接
Java code
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
Date date = sdf1.parse("20380706");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
String s = sdf2.format(date);
System.out.println(s);
[/Quote]
小绵羊 2011-07-19
  • 打赏
  • 举报
回复
LJSKR 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 ainiyidiandian 的回复:]

不是~~我的意思是,服务器个我多少就多少,不管你客户端在哪个时区,直都不会变,只是格式变化了~~
比如我要你显示类似这样的格式:2011-07-18;但是服务器返回的是20110718,这个无论你客户端在哪个时区都应该是2011-07-18~~~而不根据你客户端在什么时区来显示,可能20110718在你的时区应该是20110717但是我要显示必须是20110718,就是说不管你在哪里这个值都不……
[/Quote]

我觉得LZ要的不是时间,而是一个格式化的字符串。 服务器给了他一个值20110718, 他只是要用"2011-07-18"这种格式给它显示出来。所以,咱们要给他的并不是跟Date有关的实现,而是字符串格式化的相关实现。只要跟Date扯上了关系,就跟时区扯上了,再输出就错了。
或者一定要跟Date扯上,那么,你可以用一个相同的时区去格式化(parse)和输出(format)。
OPPPPOP 2011-07-19
  • 打赏
  • 举报
回复
踏雪耗子 2011-07-19
  • 打赏
  • 举报
回复
晚上结贴~~~~~~
shine333 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 x19881216 的回复:]

直接定义死。。用中国时间。。。。
Locale locale= Locale.CHINA;

貌似坦克哥毛了
[/Quote]
没毛,就是没想明白他一段代码(获得一个输入,得到一个结果)同时需要处理
1 生日,输入20380706(无论哪个时区) ==> 2038-07-06
2 世界时,输入20380706(根据所在时区)
20380706000000Z+0000==> 2038-07-06T00:00:00.000Z+0000
20380706000000Z+0800==> 2038-07-05T16:00:00.000Z+0000
20380706000000Z-0800==> 2038-07-06T08:00:00.000Z+0000

我觉得,这两个就应该是单独两个api
HeiBoyYang 2011-07-18
  • 打赏
  • 举报
回复
**
* 字符串转换为java.util.Date<br>
* 支持格式为 yyyy.MM.dd G 'at' hh:mm:ss z 如 '2002-1-1 AD at 22:10:59 PSD'<br>
* yy/MM/dd HH:mm:ss 如 '2002/1/1 17:55:00'<br>
* yy/MM/dd HH:mm:ss pm 如 '2002/1/1 17:55:00 pm'<br>
* yy-MM-dd HH:mm:ss 如 '2002-1-1 17:55:00' <br>
* yy-MM-dd HH:mm:ss am 如 '2002-1-1 17:55:00 am' <br>
* @param time String 字符串<br>
* @return Date 日期<br>
*/
public static Date stringToDate(String time){
SimpleDateFormat formatter;
int tempPos=time.indexOf("AD") ;
time=time.trim() ;
formatter = new SimpleDateFormat ("yyyy.MM.dd G 'at' hh:mm:ss z");
if(tempPos>-1){
time=time.substring(0,tempPos)+
"公元"+time.substring(tempPos+"AD".length());//china
formatter = new SimpleDateFormat ("yyyy.MM.dd G 'at' hh:mm:ss z");
}
tempPos=time.indexOf("-");
if(tempPos>-1&&(time.indexOf(" ")<0)){
formatter = new SimpleDateFormat ("yyyyMMddHHmmssZ");
}
else if((time.indexOf("/")>-1) &&(time.indexOf(" ")>-1)){
formatter = new SimpleDateFormat ("yyyy/MM/dd HH:mm:ss");
}
else if((time.indexOf("-")>-1) &&(time.indexOf(" ")>-1)){
formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
}
else if((time.indexOf("/")>-1) &&(time.indexOf("am")>-1) ||(time.indexOf("pm")>-1)){
formatter = new SimpleDateFormat ("yyyy-MM-dd KK:mm:ss a");
}
else if((time.indexOf("-")>-1) &&(time.indexOf("am")>-1) ||(time.indexOf("pm")>-1)){
formatter = new SimpleDateFormat ("yyyy-MM-dd KK:mm:ss a");
}
ParsePosition pos = new ParsePosition(0);
java.util.Date ctime = formatter.parse(time, pos);

return ctime;
}





public static String dateToString(Date time){
SimpleDateFormat formatter;
formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
String ctime = formatter.format(time);

return ctime;
}



public static String dateToString(Date time,int x){
SimpleDateFormat formatter;
formatter = new SimpleDateFormat ("yyyy-MM-dd KK:mm:ss a");
String ctime = formatter.format(time);

return ctime;
}



public static String Now(){
return dateToString(new Date());
}


public static String Now(int hour){
return dateToString(new Date(),hour);
}



public static String getYYYY_MM_DD(){
return dateToString(new Date()).substring(0,10);

}



public static String getYYYY_MM_DD(String date){
return date.substring(0,10);

}

public static String getHour(){
SimpleDateFormat formatter;
formatter = new SimpleDateFormat ("H");
String ctime = formatter.format(new Date());
return ctime;
}

public static String getDay(){
SimpleDateFormat formatter;
formatter = new SimpleDateFormat ("d");
String ctime = formatter.format(new Date());
return ctime;
}

public static String getMonth(){
SimpleDateFormat formatter;
formatter = new SimpleDateFormat ("M");
String ctime = formatter.format(new Date());
return ctime;
}

public static String getYear(){
SimpleDateFormat formatter;
formatter = new SimpleDateFormat ("yyyy");
String ctime = formatter.format(new Date());
return ctime;
}

public static String getWeek(){
SimpleDateFormat formatter;
formatter = new SimpleDateFormat ("E");
String ctime = formatter.format(new Date());
return ctime;
}

在jsp页面中的日期格式和sqlserver中的日期格式不一样,怎样统一?

在页面上显示输出时,用下面的函数处理一下

public class DateUtil(){
public static String fmtShortEnu(Date myDate) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
String strDate = formatter.format(myDate);
return strDate;
}
}

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
new java.text.SimpleDateFormat("yyyy-MM-dd")
建议还是把sqlserver的字段类型改成varchar的吧,用字符串处理可以完全按照自己的意愿处理,没有特殊的需求,不要使用date型


字串日期格式转换
用的API是SimpleDateFormat,它是属於java.text.SimpleDateFormat,所以请记得import进来!

用法:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
这一行最重要,它确立了转换的格式,yyyy是完整的西元年,MM是月份,dd是日期,至於HH:mm:ss就不需要我再解释了吧!
ps:为什麽有的格式大写,有的格式小写,那是怕避免混淆,例如MM是月份,mm是分;HH是24小时制,而hh是12小时制

1.字串转日期:
 2002-10-8 15:30:22要把它转成日期,可以用
 Date date=sdf.parse("2002-10-8 15:30:22");
2.日期转字串
 假如把今天的日期转成字串可用
 String datestr=sdf.format(new Date());
 这个字串的内容便类似2002-10-08 14:55:38

透过这个API我们便可以随心所欲的将日期转成我们想要的字串格式,例如希望将日期输出成2002年10月08日,
我们可以这麽写:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
String datestr=sdf.format(new Date());
datestr便会依照我们设定的格式输出


//对日期格式的转换成("yyyy-MM-dd")格式的方法
public java.sql.Date Convert(String str)
{
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
try
{
java.util.Date d = sdf.parse(str);
java.sql.Date d1 = new java.sql.Date(d.getTime());
return d1;
}
catch(Exception ex)
{
ex.printStackTrace();
return null;
}
}
应用如下:
ctmt.setDate(7,this.Convert(info.getManBirth())); // @DATETIME


常用日期问题集锦


1、获取服务器端当前日期:
<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
%>

2、获取当前年、月、日:
<%@ page import="java.util.Date"%>

<%
Date myDate = new Date();
int thisYear = myDate.getYear() + 1900;//thisYear = 2003
int thisMonth = myDate.getMonth() + 1;//thisMonth = 5
int thisDate = myDate.getDate();//thisDate = 30
%>


3、按本地时区输出当前日期
<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
out.println(myDate.toLocaleString());
%>
输出结果为:
2003-5-30


4、获取数据库中字段名为”publish_time“、类型为Datetime的值
<%@ page import="java.util.Date"%>
<%
...连接数据库...
ResultSet rs = ...
Date sDate = rs.getDate("publish_time");
%>


5、按照指定格式打印日期


Java代码
<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
Date dNow = new Date();

SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.println("It is " + formatter.format(dNow));
%>

输出的结果为:
It is 星期五 2003.05.30 at 11:30:46 上午 CST
(更为详尽的格式符号请参看SimpleDateFormat类)

6、将字符串转换为日期
<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
String input = "1222-11-11";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date t = null;
try{
t = formatter.parse(input);
out.println(t);
}catch(ParseException e){
out.println("unparseable using " + formatter);
}
%>
输出结果为:
Fri Nov 11 00:00:00 CST 1222

7、计算日期之间的间隔
<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
String input = "2003-05-01";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = null;
try{
d1 = formatter.parse(input);
}catch(ParseException e){
out.println("unparseable using " + formatter);
}

Date d2 = new Date();

long diff = d2.getTime() - d1.getTime();
out.println("Difference is " + (diff/(1000*60*60*24)) + " days.");
%>
输出结果为:
Difference is 29 days.

8、日期的加减运算
方法:用Calendar类的add()方法
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
Calendar now = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.println("It is now " + formatter.format(now.getTime()));
now.add(Calendar.DAY_OF_YEAR,-(365*2));
out.println("<br>");
out.println("Two years ago was " + formatter.format(now.getTime()));
%>
输出结果为:
It is now 星期五 2003.05.30 at 01:45:32 下午 CST
Two years ago was 星期三 2001.05.30 at 01:45:32 下午 CST

9、比较日期
方法:用equals()、before()、after()方法
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
DateFormat df = new SimpleDateFormat("yyy-MM-dd");
Date d1 = df.parse("2000-01-01");
Date d2 = df.parse("1999-12-31");

String relation = null;
if(d1.equals(d2))
relation = "the same date as";
else if(d1.before(d2))
relation = "before";
else
relation = "after";
out.println(d1 +" is " + relation + ' ' + d2);
%>
输出结果为:
Sat Jan 01 00:00:00 CST 2000 is after Fri Dec 31 00:00:00 CST 1999

10、记录一件事所花费的时间
方法:调用两次System.getTimeMillis()方法,求差值
<%@ page import="java.text.*"%>
<%
long t0,t1;
t0 = System.currentTimeMillis();
out.println("Cyc starts at " + t0);
int k = 0;
for(int i =0;i<100000;i++){
k += i;
}
t1 = System.currentTimeMillis();
out.println("<br>");
out.println("Cyc ends at " + t1);
out.println("<br>");
out.println("This run took " + (t1-t0) + "ms.");
%>
lord_is_layuping 2011-07-18
  • 打赏
  • 举报
回复
感觉还是用String分割和接自己实现格式化适合
AslenG 2011-07-18
  • 打赏
  • 举报
回复
我大概明白LZ的意思了,LZ的意思是,客户端传过来一个值,这个值必须用客户端的时区来格式化,而不是用服务器所在的时区来格式化!这样理解对吗?坦克哥挺辛苦的LZ安慰下:)
小绵羊 2011-07-18
  • 打赏
  • 举报
回复
直接定义死。。用中国时间。。。。
Locale locale= Locale.CHINA;

貌似坦克哥毛了
shine333 2011-07-18
  • 打赏
  • 举报
回复
你一会儿又说生日,一会儿又要世界时,到底要什么?

生日是生日的问题,
时区是时区的代码
踏雪耗子 2011-07-18
  • 打赏
  • 举报
回复
不是的 我是从服务器获取了日期,然后在手机上显示,比如我获取个人信息的生日,格式化之后不能变化吧~~
服务器给我的日期格式不是我想要的,服务器又不愿意改~~我现在用的是String分割拼接的,发帖主要问问有没有更好的格式,我发贴的时候写了2个方案~



[Quote=引用 21 楼 antiwise 的回复:]
楼主 你的程序是在服务器上跑的吧 而这个时间你确非要客户的手机来处理 似乎你越界了吧 比如北京时间现在12:00 客户手机人家愿意调 哪怕调的是 2000-01-01 12:00你又管的了那么多么 按照自己的标准处理好时间就行了
[/Quote]
OPPPPOP 2011-07-18
  • 打赏
  • 举报
回复
楼主 你的程序是在服务器上跑的吧 而这个时间你确非要客户的手机来处理 似乎你越界了吧 比如北京时间现在12:00 客户手机人家愿意调 哪怕调的是 2000-01-01 12:00你又管的了那么多么 按照自己的标准处理好时间就行了
踏雪耗子 2011-07-18
  • 打赏
  • 举报
回复
这样是不行的,SimpleDateFormat源码里是获取当前的时区

Locale.getDefault()或者TimeZone.getDefault()

这个获取的时区不一定是我设置的时区~~~~~比如我在手机上看,我手机时区是-12那么这个时候转化必错~





[Quote=引用 18 楼 shine333 的回复:]
服务器给你的是20380706,你就直接

Java code
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
Date date = sdf1.parse("20380706");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
String s……
[/Quote]
小绵羊 2011-07-18
  • 打赏
  • 举报
回复
同意用标准时区来格式化。。。GMT+0坦克哥的没问题的
“20380706”或“203876”也不是同一种格式
shine333 2011-07-18
  • 打赏
  • 举报
回复
服务器给你的是20380706,你就直接
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
Date date = sdf1.parse("20380706");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
String s = sdf2.format(date);
踏雪耗子 2011-07-18
  • 打赏
  • 举报
回复
我要的就是一个无时区影响的转化,只是格式变化值不变化~~~~

就是你给我传多少我只格式化不改变值,比如服务器给你一个人的个人信息,给出生日值,总不能你格式化之后生日还变了吧~~

你大概没明白我的意思~~


[Quote=引用 16 楼 shine333 的回复:]
你只有一个String,我怎么知道
张三的GMT+8"20380706" Tom的GMT+0"20380706",和Jerry的GMT-8"20380706"
[/Quote]
shine333 2011-07-18
  • 打赏
  • 举报
回复
你只有一个String,我怎么知道
张三的GMT+8"20380706" Tom的GMT+0"20380706",和Jerry的GMT-8"20380706"
加载更多回复(25)

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧