zoukankan      html  css  js  c++  java
  • 日期与编码杂记

    做一个下载的功能,但始终乱码,怎么调也好不了,返回ResponseEntity前打印内容正常,并且mock的测试返回的也正常

    RequestBuilder request = MockMvcRequestBuilders.get("/export");
    String res = mockMvc.perform(request).andExpect(status().isOk()).andReturn().getResponse().getContentAsString();

    后来发现原来是springboot在解析string类型的时候不对,解决方法如下:

    增加对byte和string的解析器

    @Configuration
    public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
        private static final Logger logger = LoggerFactory.getLogger(MyWebMvcConfigurerAdapter.class);
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            super.configureMessageConverters(converters);
            logger.info("add string and byte array converter");
            StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
            stringConverter.setDefaultCharset(Charset.forName("UTF-8"));
            converters.add(stringConverter);
            converters.add(new ByteArrayHttpMessageConverter());
        }
    }

    还要注意的是,在做下载的时候

    文件名乱码解决方法

    new String(fileName.getBytes("UTF-8"), "iso-8859-1")

    CSV类型下载需要添加头信息

    HttpHeaders headers = new HttpHeaders();
    headers.set("Content-disposition", "attachment; filename=" + fileName);
    headers.set("Content-type", "text/plain;charset=UTF-8");
    response = new ResponseEntity<String>("uFEFF" + file, headers, HttpStatus.OK);

    其他编码注意事项:见内容及结果串

            //windows自身采用的编码格式是gbk(而gbk和gb2312基本上是一样的编码方式),而IDE中Encode不修改的话,默认是utf-8的编码
            //        File file = new File("中文文件名.csv");
            //        //流编码测试,文件中文内容
            //        OutputStreamWriter bis = new OutputStreamWriter(new FileOutputStream(file), "gbk");
            //        BufferedWriter bw = new BufferedWriter(bis);
            //        bw.write("文件中文内容");
            //        bw.flush();
            //-------------------------------------------------------------------------------------
            //        File file1 = new File("中文文件名.csv");
            //        //流编码测试,鏂囦欢涓�枃鍐呭�
            //        OutputStreamWriter bis1 = new OutputStreamWriter(new FileOutputStream(file1), "utf-8");
            //        BufferedWriter bw1 = new BufferedWriter(bis1);
            //        bw1.write("文件中文内容");
            //        bw1.flush();
            //-------------------------------------------------------------------------------------
            //        File file1 = new File("中文文件名.csv");
            //        //流编码测试,??????
            //        OutputStreamWriter bis1 = new OutputStreamWriter(new FileOutputStream(file1), "iso-8859-1");
            //        BufferedWriter bw1 = new BufferedWriter(bis1);
            //        bw1.write("文件中文内容");
            //        bw1.flush();
            //-------------------------------------------------------------------------------------
            //        File file1 = new File("中文文件名.csv");
            //        //流编码测试,文件中文内容
            //        OutputStreamWriter bis1 = new OutputStreamWriter(new FileOutputStream(file1), "gb2312");
            //        BufferedWriter bw1 = new BufferedWriter(bis1);
            //        bw1.write("文件中文内容");
            //        bw1.flush();

    日期问题:

    Long类型,分为秒的和毫秒的,注意区分

    String类型,分为UTC类型和一般日期类型

    UTC类型举例:https://zhidao.baidu.com/question/585516457.html 这个牵扯到时区,要注意可能这里不对

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    Date date = sdf.parse(begin);

     一般日期类型举例:

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = sdf.parse(dateString);  

    日期转String

    String dateStr = df.format(new Date());
    long longTime = new Date().getTime();
    System.out.println("字符串类型的Long日期转换成日期:");
    String str = "1498457677473";
    Long dateLong = Long.valueOf(str);
    System.out.println("longToDate:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(dateLong)));
    
    System.out.println("Date和Long互转:");
    System.out.println("日期转换成Long:"+longTime);
    System.out.println("Long转换成日期:"+new Date(longTime));
  • 相关阅读:
    序列JSON数据和四种AJAX操作方式
    jquery.validate和jquery.form.js实现表单提交
    JQuery Validate使用总结1:
    HOWTO: Include Base64 Encoded Binary Image Data (data URI scheme) in Inline Cascading Style Sheets (CSS)(转)
    SharePoint 2007 使用4.0 .Net
    动态IP解决方案
    取MS CRM表单的URL
    从Iframe或新开的窗口访问MS CRM 2011(转)
    Toggle or Hidden MS CRM Tab
    Windows 2008下修改域用户密码
  • 原文地址:https://www.cnblogs.com/it-worker365/p/9792632.html
Copyright © 2011-2022 走看看