0 0

为什么main方法和自定义方法的代码一模一样,但是输出结果不同呢10

package com.sunsheen.dataimport;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Demo {
	private static SimpleDateFormat format = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");
	private static TimeZone zone = TimeZone.getTimeZone("Asia/Beijing");

	public static void test() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		Date date = null;
		try {
			date = sdf.parse(utcToTimeZoneDate("2014-07-31 01:00:00"));
		} catch (ParseException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		System.out.println(date
				+ "------------------------------------------------");
	}

	public static String utcToTimeZoneDate(String date) {
		Date timeStart;
		String beijing = null;
		try {
			timeStart = format.parse(date);
			format.setTimeZone(zone);
			beijing = format.format(timeStart);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return beijing;
	}

	public static void main(String[] args) throws ParseException {
		test();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		Date date = null;
		try {
			date = sdf.parse(utcToTimeZoneDate("2014-07-31 01:00:00"));
		} catch (ParseException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		System.out.println(date
				+ "***********************************************");
	}
}


问题补充:我已经知道是何原因了,我SimpleDateFormat  是静态的,然后第一次调用的时候把时区设置成北京后,后面的就全是北京时区了。在utcToTimeZoneDate 返回前把时区设置成默认的就没问题了。现在想的是在多线程下如果考虑线程安全问题,是不是只能每次都单独new一个SDF对象,然后自己玩自己的?
2014年9月18日 11:00

3个答案 按时间排序 按投票排序

0 0

采纳的答案

这是一个常识,即SimpleDateFormat 并不是线程安全的,尽管其看起来很像是线程安全的。 有人讨论过设计的“坏味道”,提到过SimpleDateFormat的设计。实际上时区是作为对象的属性共享的,导致其线程不安全的问题,可以参考其Javadoc的说明。

2014年9月19日 13:45
0 0

应该是时区影响的,具体原因也不是特别清楚,正在查询资料,看是否能找到答案

2014年9月18日 15:25
0 0

把第31行的代码
format.setTimeZone(zone); 
提到30行就一样了,时区放到上面。

2014年9月18日 12:22

相关推荐

    JAVA代码生成,支持模板自定义,完美运行

    codeFactory 介绍: 1.codeFactory: Java代码生成,依赖rapid-generator.4.0.6.jar, 支持自定义模板生成代码, 弱业务下完全...3.main方法运行CodeGenerator类,在配置的outRoot输出路径找到生成代码,复制到对应项目包下.

    学习java的自定义异常演示代码

    在`Exception_JDemo`示例中,我们看到如何定义和使用自定义异常`MyException`,以及如何在`main`方法中进行相应的异常处理。理解并熟练掌握自定义异常的使用,对于提升Java程序的健壮性和可维护性至关重要。

    自定义窗体演示代码

    在这个文件中,开发者会编写事件处理函数、自定义方法以及窗体的初始化和清理代码。 6. **图像资源**: `face_source.gif`可能是一个用于窗体设计的图形资源,例如作为背景图片或窗体上的图标。在Delphi中,可以...

    bat 运行java main方法

    2. 输入以下命令行,将`your-jar-file.jar`替换为你的实际`jar`文件名,`your-class-name`替换为包含`main`方法的类全名(包括包名): ``` @echo off java -jar your-jar-file.jar your-class-name ``` 3. 保存...

    Java中自定义构造方法及其测试的代码清单.pdf

    测试代码展示了如何在实际场景中应用这些构造方法和方法,从而更好地理解和掌握Java面向对象编程的基本概念。在实际编程中,自定义构造方法可以极大地提高代码的可读性和可维护性,同时允许更灵活地初始化对象状态。

    java如何自定义异常用代码.doc

    在这个例子中,我们定义了两个自定义异常类:`ChushufuException`和`ChushulingException`,它们分别表示“除数为负”和“除数为零”的错误情况。这两个类都继承自`Exception`,这意味着它们是受检异常,需要在方法...

    mybatis-plus3.5.1,代码生成器集成(自定义模板).pdf

    为了满足不同项目的个性化需求,我们可以通过自定义模板来实现更加灵活的代码生成。具体步骤如下: 1. **创建模板文件**:在项目中创建相应的模板文件,如 `/templates/serviceImpl.java`。 2. **配置模板路径**:...

    Android 中“自定义权限”源代码

    ### Android中的自定义权限详解与实现 #### 一、引言 在Android系统中,为了保护用户隐私和数据安全,应用程序被赋予了基于权限的安全模型。Android预定义了一系列权限,如访问联系人、发送短信等,但同时也允许...

    Qt自定义虚拟键盘代码

    为了在不同平台上运行,Qt的跨平台特性使得代码可以无需修改就能在Windows和Linux上工作。然而,需要注意的是,有些系统API可能在不同平台上有差异,比如获取焦点或发送模拟按键事件。因此,你可能需要使用Qt的...

    C#自定义命名空间与使用自定义的命名空间方法

    ### C#自定义命名空间与使用自定义命名...通过上述步骤,你可以创建和使用自定义的命名空间,从而更好地组织和复用代码。命名空间是C#语言中一个重要的特性,掌握其使用方法对于编写大型、模块化的应用程序至关重要。

    java中main方法发送httpPost请求

    因为我们是发送POST请求,所以需要设置请求方法为POST: ```java connection.setRequestMethod("POST"); ``` 3. **设置请求属性** 通常,POST请求需要设置Content-Type,表明我们要发送的数据类型: ```...

    GUI开发示例代码---QTdesigner实现自定义槽函数

    在上面的代码中,`MyApp`类继承自`QMainWindow`和`Ui_MainWindow`,这样我们就可以使用`setupUi(self)`方法来加载UI布局。`on_button_clicked`函数是我们自定义的槽函数,它会在按钮被点击时执行。`self.button....

    Ikanalyzer分词器动态自定义词库的方法.doc

    IKAnalyzer提供了动态自定义词库的方法,使得开发者可以根据不同的应用场景和需求,灵活地配置分词器的词库。 动态自定义词库的方法主要通过自定义Configuration类来实现。Configuration类是IKAnalyzer的核心配置类...

    log4j输出多个自定义路径的日志文件小例子

    在这个例子中,我们为每个日志文件创建了一个独立的日志器,通过`Logger.getLogger()`方法传入不同的名字,这样Log4j会根据配置文件中的Appender名字来决定日志的输出位置。 通过这种方式,我们可以在一个项目中...

    C++自定义结构体排序实现

    在代码中,我们首先定义了一个名为AssessTypeInfo的结构体,该结构体包含三个成员变量:m_uiType、m_szName和m_uiTotal。然后,我们重载了小于号(<)和大于号(>)运算符,以便实现升序和降序排序。 在main函数中...

    使用自定义格式化程序将ElmDebuglog输出转换为nice日志对象

    在某些情况下,我们可能希望将这些日志输出转换为更友好的“nice”日志对象,以便于分析和调试。这就是自定义格式化程序的作用。 `Debug.log`在Elm中主要用于在运行时打印变量的值,它返回一个值,这个值可以被正常...

    Python3导入自定义模块的三种方法详解

    在Python编程中,模块是代码组织的基本单位,它包含了可重用的函数、类和其他定义。模块化编程有助于代码的可读性和可维护性。在Python3中,有三种主要的方式来导入自定义模块,让我们详细地探讨每一种方法: 1. **...

    SecondarySort(代码+jar+输入文件+输出结果)

    现在,我们将深入探讨`SecondarySort`的概念、其工作原理以及如何通过提供的代码、jar包、输入文件和输出结果来理解和应用这一技术。 首先,MapReduce的基本流程包括Map阶段、Shuffle阶段、Reduce阶段。默认情况下...

    自定义window.alert对话框JS代码

    标题中的“自定义window.alert对话框JS代码”指的是一种通过编写JavaScript代码实现的自定义对话框功能,它可以拥有独特的外观和交互效果,使得信息提示更加吸引用户注意且符合网页整体风格。 描述中提到的“非常...

Global site tag (gtag.js) - Google Analytics